Как отсортировать настраиваемый массив, содержащий объект даты

У меня есть NSArray, который содержит такие настраиваемые объекты:

NSArray *array = {
 students,students

}

А объект Student, в свою очередь, хранит такие значения, как:

student.name,
student.class,
student.admissionDate
student.school ..etc

Теперь мне нужен NSArray, содержащий всю информацию о студентах, отсортированную по их admissionDate.

Я пробовал использовать NSSortDecriptor, но мне это не помогло.

ИЗМЕНИТЬ

После некоторой тяжелой работы я успешно сформировал NSMutable массив NSDictionary, который выглядит так:

      for(Student *arr in array)
{

     NSMutableDictionary *dict;
    dict = [[NSMutableDictionary alloc]init];
    [dict setObject:arr.stuName forKey:@"name"];
    [dict setObject:arr.stuAdate forKey:@"date"];
    [dict setObject:arr.stuClass    forKey:@"class"];

    [expenseArray addObject:dict];
}



Printing description of expenseArray:
<__NSArrayM 0x7fe703833f70>(
{
 name = uuu;
 Adate = "2015-10-10 10:56:03 +0000";
 class = 1st;
},
{
  name = abc;
   Adate = "2015-10-07 11:10:00 +0000";
  class = 3rd;
},
 {
   name = btw;
   Adate = "2015-10-10 11:13:47 +0000";
   class = 4th;
 }
  )

Как теперь отсортировать по дате?


person NSUser    schedule 10.10.2015    source источник
comment
извините, я пропустил, позвольте мне обновить задание   -  person NSUser    schedule 10.10.2015
comment
Что в admissionDate? а NSDate а NSString?   -  person Larme    schedule 10.10.2015
comment
@Larme Он хранит NSDate   -  person NSUser    schedule 10.10.2015
comment
@ user5370850 Пожалуйста, не забудьте ответить правильно. У всех есть время, чтобы прочитать и подумать о вашей проблеме.   -  person Shamim Hossain    schedule 11.10.2015


Ответы (4)


Дескриптор сортировки должен работать на вас

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedStudents = [studentArray sortedArrayUsingDescriptors:@[sortDescriptor]];

Ниже рабочий пример

NSMutableArray *studentArray = [NSMutableArray new];

for (int i = 0; i < 8; i++) {
    Student *student = [Student new];

    unsigned int randomInterval = arc4random();
    student.admissionDate = [NSDate dateWithTimeIntervalSinceNow:randomInterval];
    [studentArray addObject:student];
}


for (Student *student in studentArray) {
    NSLog(@"%@", student.admissionDate);
}


NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedStudents = [studentArray sortedArrayUsingDescriptors:@[sortDescriptor]];

NSLog(@"\n\n * * * * * After Sorting * * * * * *\n\n");

for (Student *student in sortedStudents) {
    NSLog(@"%@", student.admissionDate);
}

Журналы

2024-02-11 23:47:47 +0000
2093-11-13 21:49:48 +0000
2042-04-06 23:53:28 +0000
2032-12-23 01:49:46 +0000
2102-12-28 23:08:06 +0000
2058-10-17 14:14:27 +0000
2142-02-01 07:19:34 +0000
2048-05-14 07:07:04 +0000

* * * * * After Sorting * * * * * *

2024-02-11 23:47:47 +0000
2032-12-23 01:49:46 +0000
2042-04-06 23:53:28 +0000
2048-05-14 07:07:04 +0000
2058-10-17 14:14:27 +0000
2093-11-13 21:49:48 +0000
2102-12-28 23:08:06 +0000
2142-02-01 07:19:34 +0000
person Inder Kumar Rathore    schedule 10.10.2015

Дескриптор сортировки должен работать нормально

NSSortDescriptor *admissionSort = [NSSortDescriptor sortDescriptorWithKey:@"Adate" ascending:NO];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[admissionSort]];

отсортирует массив по дате поступления, предполагая, что это действительно значение NSDate.

person Joris Kluivers    schedule 10.10.2015

Хотя NSSortDescription кажется лучшим способом сортировки массива, вот альтернативный подход:

NSArray *studentsArray = @[someStudent1, someStudent2];
NSArray *sortedStudentsArray = [studentsArray sortedArrayUsingComparator:^NSComparisonResult(Student *student1, Student *student2) {
    return [student1.admissionDate compare:student2.admissionDate];
}];
person psci    schedule 10.10.2015

NSSortDescriptor отлично работает!

Вам следует заменить изменяемый словарь на класс Student.

@interface Student : NSObject

@property NSString *name;
@property NSString *className;
@property NSString *schoolName;
@property NSDate *admissionDate;

@end

@implementation Student


@end  

Использование этого класса

Student *student1 = [[Student alloc] init];
student1.name = @"Name a";
student1.className = @"4th";
student1.schoolName = @"XYZ High school";
student1.admissionDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24]; // 60 * 60 * 24 one day time interval in second  

Student *student2 = [[Student alloc] init];
student2.name = @"Name b";
student2.className = @"5th";
student2.schoolName = @"XYZ High school";
student2.admissionDate = [NSDate date]; // current date


NSArray *array = [NSArray arrayWithObjects:student1,student2, nil];


NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[descriptor]];

for (Student *student in sortedArray) {
    NSLog(@"admissionDate %@", student.admissionDate);
}

Имейте в виду, что [array sortedArrayUsingDescriptors: @ [descriptor]] возвращает отсортированный массив, а не переупорядоченные элементы самого массива.

Надеюсь, это сработает.

person Shamim Hossain    schedule 10.10.2015