2015-10-10 1 views
1

je NSArray qui contient des objets personnalisés comme ceci:Comment trier tableau personnalisé qui contient l'objet de la date

NSArray *array = { 
students,students 

} 

et objet étudiant à son tour stocker des valeurs comme:

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

Maintenant, je veux une NSArray qui contient tous les détails de l'élève sur la base de leur admissionDate.

J'ai essayé d'utiliser NSSortDecriptor mais cela ne m'a pas aidé.

EDIT

Après un travail acharné, j'ai réussi formé un tableau NSMutable de NSDictionary qui ressemble à:

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

Maintenant, comment je peux trier selon la date

+0

désolé j'ai manqué laissez-moi mettre à jour la questiton – NSUser

+0

Qu'y a-t-il dans 'admissionDate'? un 'NSDate' un' NSString'? – Larme

+0

@Larme Il stocke NSDate – NSUser

Répondre

1

Le descripteur de tri devrait fonctionner pour vous

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

Voici l'exemple de travail

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

Journaux

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

Un descripteur de tri devrait fonctionner correctement

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

va trier le tableau en fonction de la date d'admission en supposant qu'il s'agit en fait d'une valeur NSDate.

0

Bien que NSSortDescription semble être la meilleure façon de trier un tableau, voici une alternative approche:

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

NSSortDescriptor fonctionne très bien!

Vous devez remplacer votre dictionnaire modifiable par la classe Student.

@interface Student : NSObject 

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

@end 

@implementation Student 


@end 

utilisations de cette classe

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

S'il vous plaît garder à l'esprit que [sortedArrayUsingDescriptors du tableau: @ [descripteur]] retour tableau trié, pas d'éléments de tableau réarrangés lui-même.

Espérons que cela fonctionnera.