سؤال

انا لدي 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 })
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top