2009-10-30 11 views

Odpowiedz

21

Nie, NSDictionary nie zachowuje kolejności reklamacji swoich kluczy.

Jeśli potrzebujesz słownika, który utrzymuje zamówienie reklamowe, sugeruję użycie CHDataStructures framework, który ma klasę CHOrderedDictionary (jest to potomek NSMutableDictionary). Dokumentacja dla CHOrderedDictionary mówi:

Słownik, który wylicza klucze w kolejności, w jakiej zostały wstawione.

następujących dodatkowych operacji są do skorzystania z zamawiającego:

-firstKey

-lastKey

-keyAtIndex:

-reverseKeyEnumerator

wpisy klucz-wartość są wstawiane tak jak w zwykłym słowniku, w tym zastępowanie wartości dla istniejących kluczy, jak podano w - setObject: forKey :. Jednak równolegle jest używana dodatkowa struktura do śledzenia kolejności wstawiania, a klucze są wyliczane w tej kolejności. Jeśli klucz, który ma zostać dodany, aktualnie nie istnieje w słowniku, zostanie dodany na końcu listy, w przeciwnym razie kolejność wstawiania klucza się nie zmieni.

+1

tylko po to, by wypełnić ... to biblioteka, a nie ramy! Pozdrawiam ... – stk

4

Nie, nie jest zamówione. Możesz użyć tablicy kluczy, aby zapamiętać zamówienie, jeśli potrzebujesz, ale słowniki są koncepcyjnie nieuporządkowanymi workami par klucz-wartość.

11

klucze NSDictionary nie są utrzymywane w porządku, ale można je dostać i sortować je, E. G:

for (key in [[myDict allKeys] sortedArrayUsingSelector:@selector(compare:)]) 
... 
+1

Szybkie i łatwe, dzięki. Ale czy aplikacja musi wykonać operację sortowania za każdym razem, gdy przechodzi przez pętlę? Jeśli tak, robiłbym sortowanie raz i umieściłem ten wynik w zmiennej, a następnie iterowałem po zmiennej. – arlomedia

+2

@arlomedia Nie, pętla for najpierw ocenia wyrażenie kolekcji, a następnie iteruje wynik. Sortowanie odbywa się tylko raz w tym przykładzie. –

+1

pytanie dotyczy zamówionej (w zamówieniu reklamowym), nie posortowanej. – user102008

4

Coś chciałbym dodać w przypadku gdy ktoś szuka tego i potknięć w tym wątku:

jest to dość łatwo obejść za zamówione słowników, a to HAV tablicę, która zawiera klucze w żądanej kolejności. Następnie mając nieuporządkowany słownik, ale możesz uzyskać dostęp do każdego klawisza w kolejności, używając klawiszy z tablicy:

NSString *key = [arrayOfKeys objectAtIndex:0]; 
NSString *stringAtIndexZero = [unorderedDictionary objectForKey:key]; 
Powiązane problemy