فرز nsarray من الأوتار أو الكائنات
-
16-09-2019 - |
سؤال
انا لدي NSArray
يحتوي على سلاسل التاريخ (أي nsstring) مثل هذا: "الخميس، 21 مايو 09 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];
قد تستخدم أيضا شيئا مثل ما يلي:
//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/2012/04/sorting-nsarray-with-blocks.html.
ما كان يعمل في حالتي هو ما يلي:
nsarray * aunsorted = [datatodb allkeys]؛ NSArray * Arr Trugeys = [Aunsorted SortEdRayusingComparator: ^ nscomparisonResult (ID OBJ1، ID OBJ2) {nsdateformatter * df = [[nsdateformatter alloc] 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];
عند استخدام أ NSMutableArray
, ، يمكنك استخدام sortArrayUsingFunction:context:
في حين أن.
بمجرد أن يكون لديك NSDate
, ، يمكنك إنشاء NSSortDescriptor
مع initWithKey:ascending:
ثم استخدم sortedArrayUsingDescriptors:
للقيام الفرز.
غير هذا
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
دائما
SWIFT 3.0.
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })