2009-07-31 14 views
19

Zastanawiam się, czy istnieje klasa, która implementuje interfejsy Map i List w Javie.Uporządkowanie listy uporządkowanych map w Javie

Mam strukturę danych, która jest przede wszystkim Map. I mapuje ciągi (identyfikatory) do Image s. Ale w określonej części mojego kodu, muszę przedstawić użytkownikowi wszystkie dostępne IDed Images. Jedynym sposobem na to, że do tej pory jest to napisać:

for (String id : myMap.keySet()) { 
    // get the image like this "myMap.get(id)" 
} 

więc byłoby miło mieć klasy, która implementuje zarówno Map i List więc może po prostu napisać:

for (Image img : myMap) { 
    // the image is img 
} 

Czy ktoś znasz taką implementację?

EDYCJA: Po obejrzeniu odpowiedzi (które są poprawne, głosowano w górę), teraz zdaję sobie sprawę, że potrzebuję również posortowania mapy. Kiedy mówię "posortowane", wszystko co mam na myśli to to, że chciałbym mieć wartości w określonej kolejności, którą mógłbym zmodyfikować. Wiem, że to nie jest oryginalne pytanie, ale właśnie zdałem sobie sprawę, że tego potrzebuję.

EDYTOWANIE 2: Wygląda na to, że jestem niezdecydowany. Potrzebuję uporządkowanej mapy, a nie uporządkowanej. Przepraszam za zamieszanie, ludzie.

Odpowiedz

34

Jeśli potrzebujesz przedmioty w określonej kolejności, LinkedHashMap jest twoim przyjacielem - utrzymuje pozycje w kolejności wprowadzania. TreeMap będzie przechowywać twoje przedmioty w kolejności określonej przez Komparator, który podasz, lub metodę compareTo klucza.

+0

dziękuję, to jest dokładnie to, czego potrzebuję. –

+0

miło byłoby móc zmienić kolejność elementów :( –

+0

Myślę, że możesz ponownie umieścić element na końcu mapy, usuwając go i wstawiając ponownie. – Rorick

19

Aby zamówić mapę, spójrz na numer LinkedHashMap. To pozwoli zachować klucze w kolejności wstawiania.

Jeśli użyjesz SortedMap, klucze będą przechowywane w posortowanej kolejności. (Najbardziej popularna implementacja to TreeMap).

To, czego można użyć, to map.entrySet(). Umożliwi to iterację w zestawie MapEntries.

Zapoznaj się z javadoc, aby uzyskać więcej informacji.

+1

+1 krótki i dobra odpowiedź. – bastianneu

+0

dzięki za odpowiedź. sprawdź moje zmiany, ponieważ moje pytanie nieco się zmieniło. –

+0

Dzięki. Zwykle wolę zwięzłość nad długowiecznością. – jjnguy

2

Daje to zbiór przechowywanych wartości

myMap.values() 
+0

dobra odpowiedź. sprawdź moje zmiany, ponieważ moje pytanie nieco się zmieniło. –

+0

A HashMap wygeneruje kolekcję wartości posortowaną według hasha - zwykle nie jest to, czego potrzebujesz. Więc idź z odpowiedzią jinguy i użyj TreeMap, a następnie wywołaj wartości(). – Stroboskop

3

można wykorzystać metodę Map.values(), która zwraca Collection.

+0

dobra odpowiedź. sprawdź moje zmiany, ponieważ moje pytanie nieco się zmieniło. –

2

Spróbuj tego:

for (Image img : myMap.values()) { 
    // the image is img 
} 

Dla posortowanej mapie spojrzenie na java.util.SortedMap wdrożeń. java.util.TreeMap jest najczęściej wybierany. Jeśli potrzebujesz właśnie gwarantowanego zamówienia iteracji, możesz spróbować java.util.LinkedHashMap. Oferuje iterację w tej samej kolejności, w jakiej umieszczasz elementy na mapie. Lub opcjonalnie w ostatnio dostępnej kolejności. Jeśli chcesz przenieść klucz (raz dodany) na koniec mapy, musisz go jawnie usunąć i ponownie umieścić.

+0

ładna odpowiedź. sprawdź moje zmiany, ponieważ moje pytanie nieco się zmieniło. –

0

można użyć TreeMap jest posortowana według naturalnego uporządkowania swoich kluczy, lub przez komparator przewidzianego w momencie tworzenia mapy:

TreeMap<String, Image> mapByName = new TreeMap<String, Image>(new ByNameComparator()); 

gdzie ByNameComparator() jest komparator. Alternatywnie możesz użyć metody value() i sortowania za pomocą kolekcji.sort():

Collection<Image> images = mapByName.values(); 
Collections.sort(images, new BySizeComparator()); 
7

Masz już kilka praktycznych odpowiedzi. Ale odpowiadając bezpośrednio na pytanie ...

Błąkałem się, jeśli istnieje klasa, która implementuje interfejsy Map i List w Javie.

... Warto wspomnieć, że jest to po prostu niemożliwe. remove(Object) metoda jest przeszkodą.

W Map interfejsem jego podpis jest:

V remove(Object key); 

I List interfejsu to:

boolean remove(Object o); 
Powiązane problemy