2009-07-31 6 views
19

Ich frage mich, ob es eine Klasse gibt, die die Map und List Schnittstellen in Java implementiert.Geordnete Liste Map-Implementierung in Java

Ich habe eine Datenstruktur, die in erster Linie eine Map ist. Ich zeichne Strings (IDs) zu Image s. Aber in einem bestimmten Teil meines Codes muss ich dem Benutzer alle verfügbaren IDed Images präsentieren. Der einzige Weg, das zu tun, so weit ist, dies zu schreiben:

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

So wäre es schön, eine Klasse zu haben, die sowohl Map und List implementiert, so konnte ich einfach schreiben:

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

Hat jemand von einer solchen Implementierung wissen?

BEARBEITEN: Nach dem Anzeigen der Antworten (die alle korrekt sind, abgestimmt), merke ich jetzt, ich müsste auch die Karte sortiert werden. Wenn ich "sortiert" sage, meine ich nur, dass ich möchte, dass die Werte in einer bestimmten Reihenfolge vorliegen, die ich ändern könnte. Ich weiß, das ist nicht die ursprüngliche Frage, aber ich habe gerade gemerkt, dass ich das brauche.

EDIT 2: Es scheint, ich bin unentschlossen. Was ich brauche, ist eine geordnete Karte, keine sortierte. Entschuldigung für die Verwirrung, Leute.

Antwort

34

Wenn Sie Ihre Artikel in einer bestimmten Reihenfolge benötigen, LinkedHashMap ist dein Freund - es hält Artikel in Auftrag. TreeMap speichert Ihre Artikel in einer Reihenfolge, die entweder durch einen von Ihnen angegebenen Komparator oder eine compareTo-Methode des Schlüssels definiert ist.

+0

danke das ist genau das, was ich brauche. –

+0

wäre es schön, in der Lage zu sein, die Reihenfolge der Artikel zu ändern :( –

+0

Ich denke, Sie können den Artikel an das Ende der Karte wieder einfügen, indem Sie es entfernen und setzen wieder. – Rorick

19

Für eine bestellte Karte, schauen Sie sich die LinkedHashMap. Dadurch bleiben Ihre Schlüssel in der Reihenfolge des Einfügens erhalten.

Wenn Sie eine SortedMap verwenden, werden die Schlüssel in sortierter Reihenfolge gespeichert. (Die TreeMap ist die häufigste Implementierung.)

Was Sie verwenden können, ist map.entrySet(). Dadurch können Sie über den Satz von MapEntries iterieren.

Überprüfen Sie die javadoc für ein bisschen mehr Info.

+1

+1 kurze und gute Antwort. – bastianneu

+0

danke für die Antwort. Bitte überprüfe meine Änderungen, da sich meine Frage leicht geändert hat. –

+0

Danke. Gewöhnlich bevorzuge ich die Kürze über die Langatmigkeit. – jjnguy

2

Dies gibt Ihnen eine Sammlung der gespeicherten Werte

myMap.values() 
+0

nette Antwort. Bitte überprüfe meine Änderungen, da sich meine Frage leicht geändert hat. –

+0

Eine HashMap erzeugt eine nach Hash-Werten sortierte Wertauflistung - was normalerweise nicht das ist, was Sie wollen. Also gehen Sie mit Jinguys Antwort und verwenden Sie eine TreeMap und rufen Sie dann Werte(). – Stroboskop

3

Sie die Map.values() Methode verwenden, die eine Collection zurückgibt.

+0

nette Antwort. Bitte überprüfe meine Änderungen, da sich meine Frage leicht geändert hat. –

2

Versuchen Sie folgendes:

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

Bei sortierten Karte sehen java.util.SortedMap Implementierungen. java.util.TreeMap ist die häufigste Wahl. Wenn Sie nur eine Iterationsreihenfolge benötigen, können Sie versuchen java.util.LinkedHashMap. Es bietet Iteration in der gleichen Reihenfolge, in der Sie Elemente zuordnen. Oder optional in der Reihenfolge, auf die zuletzt zugegriffen wurde. Wenn Sie den Schlüssel (einmal hinzugefügt) am Ende der Karte verschieben möchten, müssen Sie ihn explizit entfernen und erneut einfügen.

+0

nette Antwort. Bitte überprüfe meine Änderungen, da sich meine Frage leicht geändert hat. –

0

können Sie eine TreeMap verwenden Sie es nach der natürlichen Ordnung der Schlüssel sortiert ist, oder durch einen Komparator auf Karte Erstellungszeit zur Verfügung gestellt:

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

wo ByNameComparator() einen Komparator ist. Alternativ können Sie das methods values ​​() verwenden und mit Collections sortieren.(Sortiert):

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

Sie haben bereits eine Reihe praktischer Antworten. Aber direkt die Frage beantworten ...

Ich war Wandern, wenn es eine Klasse gibt, die sowohl Map-und List-Schnittstellen in Java implementiert.

... es ist erwähnenswert, dass es einfach unmöglich ist. remove(Object) Methode ist das Hindernis.

In Map Schnittstelle seine Unterschrift ist:

V remove(Object key); 

Und in List Schnittstelle ist es:

boolean remove(Object o); 
Verwandte Themen