2011-11-30 11 views
6

Hihi all,iPhone - Sortowanie NSMutableArray zawierającej NSDictionary z 2 kluczami

Mam NSMutableArray zawierający różne NSDictionary. W każdym z NSDictionary mam dwie pary klucz-wartość, np. Nazwa użytkownika i loginData.

Potrzebowałbym posortować wszystkie NSDictionary w tym NSMutableArray na podstawie rosnąco malejąco i nazwy użytkownika rosnąco.

Żeby zilustrować dokładniej:

NSMutableArray (index 0): NSDictionary -> username:"user1", loginDate:20 Dec 2011 
NSMutableArray (index 1): NSDictionary -> username:"user2", loginDate:15 Dec 2011 
NSMutableArray (index 2): NSDictionary -> username:"user3", loginDate:28 Dec 2011 
NSMutableArray (index 3): NSDictionary -> username:"user4", loginDate:28 Dec 2011 

Po sortowaniu, wynik na tablicy powinno być:

NSMutableArray (index 0): NSDictionary -> username:"user3", loginDate:28 Dec 2011 
NSMutableArray (index 1): NSDictionary -> username:"user4", loginDate:28 Dec 2011 
NSMutableArray (index 2): NSDictionary -> username:"user1", loginDate:20 Dec 2011 
NSMutableArray (index 3): NSDictionary -> username:"user2", loginDate:15 Dec 2011 

W jaki sposób można to osiągnąć? Przeszedłem przez niektóre metody sortUsingComparator, nie mogę znaleźć sposobu na to.

+0

Czy loginData jest ciągiem znaków czy jest to NSDate? –

+0

To jest NSDate. –

Odpowiedz

6

Może coś takiego?

[array sortUsingDescriptors: 
[NSArray arrayWithObjects: 
    [[[NSSortDescriptor alloc] 
    initWithKey:@"loginDate" 
    ascending:NO] 
    autorelease], 
    [[[NSSortDescriptor alloc] 
    initWithKey:@"username" 
    ascending:YES] 
    autorelease], 
    nil]]; 

Jeśli budować dla iOS 4 lub nowszym można nawet zrobić:

[array sortUsingDescriptors: 
[NSArray arrayWithObjects: 
    [NSSortDescriptor sortDescriptorWithKey:@"loginDate" ascending:NO], 
    [NSSortDescriptor sortDescriptorWithKey:@"username" ascending:YES], 
    nil]]; 

Działa to stosując metodę compare: porównać wartości klucza własności, to jest wartość zwracana przez valueForKey:. W przypadku NSDictionary będzie on mniej więcej po prostu wywoływać objectForKey:, aby uzyskać wartość. Istnieje kilka specjalnych oznaczeń, takich jak nazwa klucza przedrostka z "@", patrz Difference valueforKey objectForKey po więcej szczegółów.

+0

Dzięki za radę, na pewno go wypróbujemy i ponownie otrzymamy opinię .. :) –

+0

To będzie sortować za pomocą selektora 'compare:' dla każdego klawisza. Możesz także wybrać inny selektor lub użyć niestandardowego komparatora dla każdego deskryptora sortowania, jeśli chcesz. –

+0

Dziękuję bardzo! To działa! :) –