ฉันมีNSArray
สตริงวันที่(เช่น NSString)ดังนี้ "พฤ 21 พ.ค. 52 19:10:09 น. -0700"
ฉันต้องการจัดเรียงNSArray
ตามวันที่ ฉันคิดเกี่ยวกับการแปลงสตริงวันที่เป็นNSDate
วัตถุก่อน แต่ติดอยู่ที่วิธีการจัดเรียงตามNSDate
วัตถุ
ขอบคุณ.
ฉันมีNSArray
สตริงวันที่(เช่น NSString)ดังนี้ "พฤ 21 พ.ค. 52 19:10:09 น. -0700"
ฉันต้องการจัดเรียงNSArray
ตามวันที่ ฉันคิดเกี่ยวกับการแปลงสตริงวันที่เป็นNSDate
วัตถุก่อน แต่ติดอยู่ที่วิธีการจัดเรียงตามNSDate
วัตถุ
ขอบคุณ.
คำตอบ:
จัดเก็บวันที่เป็นNSDate
วัตถุในอาร์เรย์ NS (เปลี่ยนแปลงได้) จากนั้นใช้-[NSArray sortedArrayUsingSelector:
หรือ-[NSMutableArray sortUsingSelector:]
และส่งผ่าน@selector(compare:)
เป็นพารามิเตอร์ -[NSDate compare:]
วิธีการจะสั่งซื้อในวันที่เรียงลำดับขึ้นสำหรับคุณ สิ่งนี้ง่ายกว่าการสร้างNSSortDescriptor
และง่ายกว่าการเขียนฟังก์ชันเปรียบเทียบของคุณเอง (อNSDate
อบเจ็กต์รู้วิธีเปรียบเทียบกันเองอย่างน้อยก็มีประสิทธิภาพมากที่สุดเท่าที่เราจะทำได้ด้วยโค้ดที่กำหนดเอง)
หากฉันมีNSMutableArray
วัตถุที่มีฟิลด์ "beginDate" ประเภทที่NSDate
ฉันใช้NSSortDescriptor
ดังต่อไปนี้:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
-[NSMutableArray sortUsingComparator:]
(10.6+) และส่งผ่านบล็อกที่ส่งคืนผลลัพธ์ของการเรียก-compare:
ในสองฟิลด์ มันอาจจะเร็วกว่าการเรียก-valueForKey:
ใช้วัตถุแต่ละชิ้น คุณสามารถใช้-sortWithOptions:usingComparator:
และส่งผ่านตัวเลือกเพื่อจัดเรียงพร้อมกันได้เช่นกัน
คุณอาจใช้สิ่งต่อไปนี้:
//Sort the array of items by date
[self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj2.date compare:obj1.date];
}];
แต่ไม่คิดว่าวันที่จะถูกเก็บไว้เป็นNSDate
ค่อนข้างNString
ซึ่งควรจะไม่มีปัญหาที่จะทำให้ / ทำ ขอแนะนำให้จัดเก็บข้อมูลในรูปแบบดิบด้วย ทำให้ง่ายต่อการจัดการในสถานการณ์เช่นนี้
คุณสามารถใช้บล็อกเพื่อจัดเรียงเข้าที่:
sortedDatesArray = [[unsortedDatesArray sortedArrayUsingComparator: ^(id a, id b) {
NSDate *d1 = [NSDate dateWithString: s1];
NSDate *d2 = [NSDate dateWithString: s2];
return [d1 compare: d2];
}];
ฉันขอแนะนำให้คุณแปลงสตริงทั้งหมดของคุณเป็นวันที่ก่อนที่จะเรียงลำดับเพื่อไม่ให้ทำการแปลงมากกว่าที่มีรายการวันที่ อัลกอริทึมการจัดเรียงใด ๆ จะทำให้คุณได้รับการแปลงสตริงจนถึงปัจจุบันมากกว่าจำนวนรายการในอาร์เรย์ (บางครั้งอาจมากกว่านั้นมาก)
ข้อมูลเพิ่มเติมเกี่ยวกับการเรียงบล็อก: http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html
สิ่งที่ได้ผลในกรณีของฉันมีดังต่อไปนี้:
NSArray * aUnsorted = [dataToDb allKeys]; NSArray * arrKeys = [aUnsorted sortedArrayUsingComparator: ^ NSComparisonResult (id obj1, id obj2) { NSDateFormatter * df = [[NSDateFormatter จัดสรร] init]; [df setDateFormat: @ "dd-MM-yyyy"]; NSDate * d1 = [df dateFromString: (NSString *) obj1]; NSDate * d2 = [df dateFromString: (NSString *) obj2]; กลับ [d1 เปรียบเทียบ: d2]; }];
ฉันมีพจนานุกรมซึ่งคีย์ทั้งหมดที่วันที่อยู่ในรูปแบบ dd-MM-yyyy และ allKeys ส่งคืนคีย์พจนานุกรมโดยไม่เรียงลำดับและฉันต้องการนำเสนอข้อมูลตามลำดับเวลา
คุณสามารถใช้sortedArrayUsingFunction:context:
. นี่คือตัวอย่าง:
NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
NSDate *d1 = [NSDate dateWithString:s1];
NSDate *d2 = [NSDate dateWithString:s2];
return [d1 compare:d2];
}
NSArray *sorted = [unsorted sortedArrayUsingFunction:dateSort context:nil];
เมื่อใช้ a NSMutableArray
คุณสามารถใช้sortArrayUsingFunction:context:
แทนได้
NSDate
วัตถุอยู่แล้วคุณสามารถใช้คำตอบของฉันด้านบนหรือแม้แต่ใช้-[NSMutableArray sortUsingComparator:]
ซึ่งเพิ่มใน 10.6
เมื่อคุณมีNSDate
แล้วคุณสามารถสร้างNSSortDescriptor
ด้วยinitWithKey:ascending:
แล้วใช้sortedArrayUsingDescriptors:
เพื่อทำการเรียงลำดับ
Swift 3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
เปลี่ยนสิ่งนี้
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
ถึง
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
เพียงแค่เปลี่ยนคีย์: จะต้องเป็นDate
เสมอ