Szukam klasy w java, która ma powiązanie klucz-wartość, ale bez użycia skrótów. Oto co obecnie robię:
- Dodaj wartości do
Hashtable
. - Uzyskaj iterator dla
Hashtable.entrySet()
. - Iteruj przez wszystkie wartości i:
- Zdobądź
Map.Entry
iterator. - Utwórz obiekt typu
Module
(klasa niestandardowa) na podstawie wartości. - Dodaj klasę do JPanel.
- Zdobądź
- Pokaż panel.
Problem polega na tym, że nie mam kontroli nad kolejnością, aby odzyskać wartości, więc nie mogę wyświetlić wartości w podanej kolejności (bez zakodowania kolejności na stałe).
Użyłbym do tego ArrayList
lub Vector
, ale później w kodzie muszę pobrać Module
obiekt dla danego klucza, czego nie mogę zrobić z ArrayList
lub Vector
.
Czy ktoś wie o darmowej / otwartej klasie Java, która to zrobi, lub o sposobie uzyskania wartości z Hashtable
podstawie tego, kiedy zostały dodane?
Dzięki!
java
dictionary
key-value
Shane
źródło
źródło
Odpowiedzi:
Proponuję a
LinkedHashMap
lub aTreeMap
. ALinkedHashMap
utrzymuje klucze w kolejności, w której zostały wstawione, a ATreeMap
jest sortowane według aComparator
lub naturalnejComparable
kolejności elementów.Ponieważ nie musi utrzymywać sortowania elementów,
LinkedHashMap
w większości przypadków powinno być szybsze;TreeMap
maO(log n)
wydajnośćcontainsKey
,get
,put
iremove
, zgodnie z Javadocs, gdyLinkedHashMap
jestO(1)
dla każdego z nich.Jeśli interfejs API, który oczekuje tylko przewidywalnego porządku sortowania, w przeciwieństwie do konkretnego porządku sortowania, rozważ użycie interfejsów implementowanych przez te dwie klasy
NavigableMap
lubSortedMap
. To pozwoli ci nie wyciekać konkretnych implementacji do twojego API i przechodzić później do jednej z tych konkretnych klas lub zupełnie innej implementacji.źródło
LinkedHashMap zwróci elementy w kolejności, w jakiej zostały wstawione do mapy podczas iteracji po keySet (), entrySet () lub wartościach () mapy.
Spowoduje to wydrukowanie elementów w kolejności, w jakiej zostały umieszczone na mapie:
źródło
Jeśli niezmienna mapa pasuje do twoich potrzeb, istnieje biblioteka Google o nazwie guava (zobacz także pytania z guava )
Guava zapewnia ImmutableMap z niezawodną kolejnością iteracji określoną przez użytkownika. Ta ImmutableMap ma wydajność O (1) dla zawieraKey, get. Oczywiście wstawianie i usuwanie nie są obsługiwane.
Obiekty ImmutableMap są konstruowane przy użyciu eleganckich metod wygody statycznej () i copyOf () lub obiektu Builder .
źródło
Możesz zachować
Map
(dla szybkiego wyszukiwania) iList
(dla porządku), aleLinkedHashMap
może być najprostszy. Możesz także wypróbowaćSortedMap
np.TreeMap
, Który ma dowolną określoną przez ciebie kolejność.źródło
Nie wiem, czy jest to program typu open source, ale po małym googlowaniu znalazłem tę implementację Map przy użyciu ArrayList . Wygląda na to, że jest wcześniejsza niż 1.5 Java, więc możesz chcieć ją uogólnić, co powinno być łatwe. Pamiętaj, że ta implementacja ma dostęp O (N), ale nie powinno to stanowić problemu, jeśli nie dodasz setek widżetów do JPanel, czego i tak nie powinieneś.
źródło
Możesz wypróbować moją implementację Powiązanej mapy drzewa .
źródło
Ilekroć muszę zachować naturalny porządek rzeczy, które są znane z góry, używam EnumMap
klucze będą wyliczane i możesz wstawiać w dowolnej kolejności, ale po iteracji będzie to powtarzać w kolejności wyliczeniowej (naturalny).
Również podczas korzystania z EnumMap nie powinno być żadnych kolizji, które mogą być bardziej wydajne.
Naprawdę uważam, że użycie enumMap zapewnia czysty, czytelny kod. Oto przykład
źródło
Możesz użyć LinkedHashMap do głównego zamówienia reklamowego w Mapie
Ważne punkty dotyczące klasy Java LinkedHashMap to:
LinkedHashMap zawiera wartości oparte na kluczu 3. Może mieć jeden klucz zerowy i wiele wartości zerowych. 4.To samo, co HashMap, zamiast tego utrzymuje porządek wstawiania
Ale jeśli chcesz sortować wartości na mapie za pomocą obiektu zdefiniowanego przez użytkownika lub dowolnego pierwotnego klucza typu danych, powinieneś użyć TreeMap Aby uzyskać więcej informacji, skorzystaj z tego łącza
źródło
Możesz użyć
LinkedHashMap<K, V>
lub wdrożyć własną mapę niestandardową, która utrzymuje kolejność wstawiania.Możesz użyć
CustomHashMap
następujących elementów z następującymi funkcjami:null
lub puste ciągi znaków są niedozwolone.HashMap
vsLinkedHashMap
vsCustomHashMap
Zastosowanie
CustomHashMap
:O / P:
Jeśli wiesz, że KLUCZY są naprawione, możesz użyć EnumMap. Uzyskaj wartości z plików właściwości / XML
DAWNY:
źródło