2009-08-18 18 views
9

Mam na myśli: czy kolejność klawiszy i wartości w NSDictionary zawsze jest taka sama jak w przypadku ich określenia podczas inicjowania NSDictionary? Czy powinienem lepiej utrzymać oddzielne NSArray, jeśli naprawdę potrzebuję znać kolejność kluczy?Czy klucze i wartości w zamówionym NSDictionary?

Odpowiedz

16

Nie, nie są zamówione. Dopóki nie dodasz lub nie usuniesz żadnych elementów ze słownika, pozostaną one w tej samej kolejności, ale zaraz po dodaniu lub usunięciu elementu nowe zamówienie będzie zupełnie inne.

Jeśli potrzebujesz kluczy/wartości do zamówienia, użyj zamiast tego opcji NSArray (lub innej uporządkowanej struktury danych).

+2

@ kraag22: Nigdzie w dokumentacji 'NSDictionary' nie składa żadnych obietnic ani gwarancji dotyczących zamówienia - po prostu mówi, że zapewnia" programowy interfejs do obiektów zarządzających niezmiennymi związkami kluczy i wartości ". Dokumenty dla komunikatów '-allKeys' i' -allValues' wywołują, że kolejność zwrócona przez te metody nie jest zdefiniowana, chociaż prawdopodobnie nie byłoby złym pomysłem uczynienie tego bardziej wyraźnym dla innych sposobów wyliczania elementy słownika. –

0

Klucze nigdy nie są gwarantowane w tej samej kolejności podczas uzyskiwania dostępu do NSDictionary. Jeśli można porównać klucze (co do których zakładam, że można im zadać pytanie), zawsze możesz je posortować, jeśli potrzebujesz dostępu do nich w posortowanej kolejności.

Musisz to zrobić, najpierw odczytując klucze do tablicy i oczywiście sortując tablicę.

0

NSDictionary, zgodnie z Apple's reference, jest w zasadzie wrapper wokół tabeli hash. Więc nie, nie ma gwarancji, że będą w jakiejś określonej kolejności.

+0

Jak uzyskać dostęp do tabeli mieszania? Nigdy nie widziałem zwykłego stołu mieszającego, ale chciałbym wiedzieć, jak to wygląda. Czy to duża różnica w porównaniu z używaniem dwóch synchronicznych NSArray wewnętrznie? –

+0

Czy pytasz, jak wygląda tablica asocjacyjna jako struktura danych? Wiki ma całkiem dobrą eksplorację: http: //en.wikipedia.org/wiki/Hash_table Jeśli chcesz wiedzieć, w jaki sposób Apple implementuje je i uzyskuje do nich dostęp, obawiam się, że jedyne dostępne dla nas pliki nagłówkowe;) –

+0

, więc kiedy mam to prawo, tablica asocjacyjna prawie funkcja skrótu, która obliczy poprawny indeks tablicy dla danego klucza-klucza + rozmiar tablicy. Brzmi trudno, ale jest dobry do wykonania. Jeśli to prawda, nie ma znaczenia, ile elementów zostanie dodanych do słownika. –

2

Klucze NSDictionary & wartości nie są uporządkowane. Dostępne opcje:

  • utrzymać oddzielny układ klawiszy w celu chec
  • zapis lub znajdź istniejącą klasę, która jest opakowaniem dla powyższego
  • pisać lub znaleźć istniejący podklasę NSDictionary która dodaje Interfejsy API do zamawiania
0

W rzeczywistości nie można nawet polegać na tym, że zamówienie jest takie samo podczas uruchamiania programu na dwóch różnych urządzeniach, nawet jeśli jest to dokładnie ten sam program i dokładnie ta sama wersja systemu operacyjnego.

Na przykład, jeśli uruchomisz program na iPadzie Air, kolejność elementów wewnątrz NSDictionary może być inna niż w przypadku uruchamiania tego samego programu na siatkówce iPada, nawet jeśli wersja na iOS jest dokładnie taka sama.

Podsumowując, zamawianie elementów w NSDictionary nigdy nie może być oparte na zasadzie. Musisz zawsze zakładać, że mogą znajdować się w dowolnej nieokreślonej kolejności, która może być różna na różnych urządzeniach.

Powiązane problemy