2012-10-04 10 views
10

Po dodaniu wartości w NSMutableDictionary automatycznie ustawia klucz. Jak mogę go wyłączyć i ustawić jak na pierwszy zestaw pierwszy i drugi zestaw drugi.Jak wyłączyć NSDictionary Sortuj automatycznie kluczem kluczowym

NSMutableDictionary* filteredDictionary = [NSMutableDictionary dictionary]; 

[filteredDictionary setObject:@"abc" forKey:@"1"]; 
[filteredDictionary setObject:@"abc" forKey:@"3"]; 
[filteredDictionary setObject:@"abc" forKey:@"2"]; 
[filteredDictionary setObject:@"abc" forKey:@"5"]; 
[filteredDictionary setObject:@"abc" forKey:@"4"]; 

NSLog(@"%@",filteredDictionary); 

current output: 
{ 
1 = abc; 
2 = abc; 
3 = abc; 
4 = abc; 
5 = abc;  
} 

but i want 
{ 
1 = abc; 
3 = abc; 
2 = abc; 
5 = abc;  
4 = abc; 
} 

Czy istnieje sposób wyłączenia sortowania według klucza?

+1

Wiem, że to jest prawdziwy problem ze Słownikiem.Ale mogę ci pomóc w alternatywny sposób robienia tego. Ponadto będą niewielkie zmiany w dostępie do wartości. Ponadto, nie rozumiem, z czym masz do czynienia, po tym wszystkim, czego potrzebujesz, aby uzyskać do nich dostęp tylko za pomocą KeyValue. –

+0

@amitrajput Tak, to jest punkt –

+0

Sortuje tylko klucze podczas wypisywania łańcucha opisu, nie zmienia układu pamięci opartego na tabeli mieszania. Jeśli ją wyliczysz, nie zostanie posortowana, ponieważ ma na celu dać ci szybki dostęp. –

Odpowiedz

2

Oto sposób to zrobić:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES comparator:^(id obj1, id obj2) { 

    if (obj1 > obj2) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    if (obj1 < obj2) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}]; 

NSArray *sortedKeys = [[filteredDictionary allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

NSMutableDictionary *orderedDictionary = [NSMutableDictionary dictionary]; 

for (NSString *index in sortedKeys) { 
    [orderedDictionary setObject:[filteredDictionary objectForKey:index] forKey:index]; 
} 

filteredDictionary = orderedDictionary; 
+0

Ten kod nie może się skompilować, ponieważ nie ma metody "addObject" dostępnej w [NSMutableDictionary] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference. html), zastanawiając się, jak to działało w OP. –

+0

Wow, musiałem być na chybił trafił, kiedy to napisałem ... Naprawię to! Dzięki za spostrzeżenie. –

1

NSDictionary nie jest przeznaczony do sortowania. Możesz go posortować, pobierając wszystkie klucze za pomocą allKeys i sortując tę ​​tablicę według własnych upodobań. Następnie przeprowadź pętlę w tej tablicy i uzyskaj odpowiednie wartości.

+0

, ale jeśli wiesz, proszę powiedz mi. –

+0

Zobacz posty Joachima i Simona. – Rengers

4

NSDictionary nie sortuje kluczy, kolejność klawiszy w słowniku to nie zdefiniowano ponieważ jest to kolekcja nieuporządkowana.

Oznacza to, że nie możesz ufać kolejności elementów podczas pobierania/drukowania, chyba że użyjesz keysSortedByValueUsingSelector: lub keysSortedByValueUsingComparator: do sortowania ich podczas pobierania.

Można to również zobaczyć w instrukcji obsługi allKeys;

Return Value
Nowa tablica zawierająca klucze słownika, albo pustą tablicę, jeśli słowniku nie ma wpisów.

Dyskusja
Kolejność elementów w tablicy to nieokreślona.

Nie ma sposobu, aby utrzymać kluczy/wartości zamówionych jak chcesz w NSDictionary, więc jeśli trzeba je zamawiać w tej samej kolejności, jak są one dodatkiem, w zasadzie są dwie opcje;

  • Dodaj je do/usunąć je z uporządkowanego zbioru - taki jak NSArray - w tym samym czasie, jak dodać je do NSDictionary i używać że kolekcji za zamówiony dostępu.
  • Dodaj pole do danych, które dodajesz do słownika, który zlicza dla każdego dodania, a następnie użyj tego pola z keysSortedByValueUsingComparator:, aby zamówić je podczas pobierania wszystkich kluczy z tablicy.
1

W NSDictionary nie dostaniesz dane jak wstawiasz.
Możesz użyć tablicy, jeśli chcesz uzyskać dane zgodnie z danymi, które wstawiasz,

Powiązane problemy