2015-10-10 3 views
1

У меня есть NSArray, который содержит пользовательские объекты, как это:Как сортировать пользовательский массив, содержащий дату объект

NSArray *array = { 
students,students 

} 

И студенческий объект в значениях оборотов магазина, как:

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

Теперь Я хочу NSArray, который содержит всю деталь студента, отсортированную по их admissionDate.

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

EDIT

После долгой работы я успешно сформировал 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; 
} 
) 

Теперь, как я могу сортировать по дате

+0

жаль, что я пропустил, позвольте мне обновить questiton – NSUser

+0

Что находится в 'admissionDate'? 'NSDate'' 'NSString'? – Larme

+0

@ Larme Он хранит NSDate – NSUser

ответ

1

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

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 
0

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

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

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

0

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

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

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

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

@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); 
} 

Пожалуйста, имейте в виду, что [sortedArrayUsingDescriptors массив: @ [дескриптор]] вернуть отсортированный массив, не переставить сам элемент массива.

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