2009-03-25 17 views
341

Szukam klasy w języku Java z powiązaniem klucz-wartość, ale bez użycia skrótów. Oto, co aktualnie robię:Klasa Java, która implementuje mapę i zachowuje kolejność wstawiania?

  1. Dodaj wartości do Hashtable.
  2. Uzyskaj iterator dla Hashtable.entrySet().
  3. iterację wszystkich wartości i:
    1. Get Map.Entry dla iteratora.
    2. Utwórz obiekt typu Module (klasa niestandardowa) na podstawie wartości.
    3. Dodaj klasę do JPanel.
  4. Wyświetl panel.

Problem polega na tym, że nie mam kontroli nad kolejnością, w której otrzymuję wartości z powrotem, więc nie mogę wyświetlać wartości w podanej kolejności (bez sztywnego kodowania zamówienia).

chciałbym użyć ArrayList lub Vector za to, ale później w kodzie muszę chwycić przedmiot Module dla danego klucza, który nie mogę zrobić z ArrayList lub Vector.

Czy ktoś wie o klasie wolnego/open-source języka Java, która to zrobi, lub o sposobie pobierania wartości z Hashtable w zależności od tego, kiedy zostały dodane?

Dzięki!

+1

Nie musisz używać zestawu entryset/map.entry. możesz iterować po kluczach i wartościach, używając hashtable.keys jako wyliczenia lub używając hashtable.keyset.iterator. –

+4

Mogłem zmienić tytuł, ponieważ nie używanie skrótów nie stanowi problemu, ale utrzymanie porządku reklamowego. –

Odpowiedz

552

Proponuję LinkedHashMap lub TreeMap. A LinkedHashMap utrzymuje klucze w kolejności, w jakiej zostały wstawione, podczas gdy TreeMap jest sortowane poprzez uporządkowanie elementów w postaci Comparator lub naturalnej.

Ponieważ nie musi zawierać elementów posortowanych, w większości przypadków numer LinkedHashMap powinien być szybszy; TreeMap ma wydajność O(log n) dla containsKey, get, put i remove, zgodnie z Javadocs, podczas gdy LinkedHashMap jest O(1) dla każdego.

Jeśli API, które oczekuje przewidywalnej kolejności sortowania, w przeciwieństwie do określonej kolejności sortowania, należy rozważyć użycie interfejsów, które te dwie klasy implementują: NavigableMap lub SortedMap. Pozwoli ci to nie przeciekać konkretnych implementacji do twojego interfejsu API i przełączyć się na jedną z tych klas lub na zupełnie inną implementację.

+2

To nie będzie działać dla mnie, ponieważ, jak na javadocs, to daje tylko uporządkowane wartości (przez wywołanie values ​​()). Czy istnieje sposób na uporządkowanie instancji Map.Entry? –

+1

@CoryKendall: Czy TreeMap nie działa? Powinien być posortowany według kluczy, a nie według wartości. –

+1

Mój błąd, myślałem, że zestawy zostały nieposortowane. –

1

Nie wiem, czy jest to opensource, ale po niewielkim przeszukaniu znalazłem this implementation of Map using ArrayList. Wygląda na to, że jest to Java przed wersją 1.5, więc możesz ją uogólnić, co powinno być łatwe. Zauważ, że ta implementacja ma dostęp do O (N), ale nie powinno to stanowić problemu, jeśli nie dodasz setek widżetów do swojego JPanela, ale i tak nie powinieneś.

5

można utrzymać Map (do szybkiego odnośnika) i List (na zamówienie), ale LinkedHashMap może być najprostsze. Możesz także wypróbować numer SortedMap, np. TreeMap, które mają dowolną kolejność, którą określisz.

13

Jeśli niezmienne mapa pasuje do Twoich potrzeb to nie jest biblioteką przez Google nazywa guava (patrz również guava questions)

Guava zapewnia ImmutableMap rzetelnej określonej przez użytkownika kolejności iteracji. Ta ImmutableMap ma wydajność O (1) dla containsKey, get. Oczywiście umieszczanie i usuwanie nie są obsługiwane. Obiekty są konstruowane za pomocą obiektu z eleganckimi wygodnymi obiektami: wygodnymi metodami: obiektami: of() i copyOf() lub Builder.

2

LinkedHashMap zwróci elementy w kolejności, w jakiej zostały wstawione do mapy, gdy dokonasz iteracji nad keySet(), entrySet() lub values ​​() mapy.

Map<String, String> map = new LinkedHashMap<String, String>(); 

map.put("id", "1"); 
map.put("name", "rohan"); 
map.put("age", "26"); 

for (Map.Entry<String, String> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + " = " + entry.getValue()); 
} 

To będzie drukować elementy w kolejności, w jakiej zostały wprowadzone do mapy:

id = 1 
name = rohan 
age = 26 
0

Ilekroć muszę utrzymać naturalny porządek rzeczy, które są znane z wyprzedzeniem, używam EnumMap

Klucze zostaną wyliczone i można wstawić w dowolnej kolejności, ale po iteracji będzie iterować w kolejności wyliczania (porządek naturalny).

Również podczas korzystania z EnumMap nie powinno być żadnych kolizji, które mogą być bardziej wydajne.

Naprawdę stwierdzam, że używanie enumMap zapewnia czysty, czytelny kod. Oto example

Powiązane problemy