2010-08-09 5 views
7

Ich habe eine HashMap wie folgt eingerichtet:Wie kann ich ArrayList aus HashMap extrahieren und in Java durchlaufen?

Map<String, ArrayList<String>> theAccused = new HashMap<String, ArrayList<String>>(); 

... und ich befülle dies, indem ich für jeden Namen (Schlüssel) eine Liste von Namen (Wert) hinterlege. Also:

ArrayList<String> saAccused = new ArrayList<String>(); 
// populate 'saAccused' ArrayList 
... 
// done populating 
theAccused.put(sAccuser, saAccused); 

Also jetzt möchte ich durch alle Einträge in der HashMap schauen und sehen, ob (für jeden 'sAccuser') die Liste 'saAccused' einen bestimmten Namen enthält. Das ist mein gescheiterter Versuch bisher:

Set<String> setAccusers = theAccused.keySet(); 
Iterator<String> iterAccusers = setAccusers.iterator(); 
iterAccusers.next(); 
ArrayList<String> saTheAccused; 

// check if 'sAccuser' has been accused by anyone before 
for (int i = 0; i < theAccused.size(); i++) { 
    saTheAccused = theAccused.get(iterAccusers); 

    if (saTheAccused.contains(sAccuser)) { 

    } 
    iterAccusers.next(); 
} 

... aber ich bin mir nicht sicher, wie die Set- und Iterator-Klassen funktionieren:/Das Problem ist, dass ich die "Werte" nicht habe ... Namen ... die 'sAccuser' s ... für die HashMap verfügbar.

Kurz gesagt, ich möchte die HashMap durchlaufen und prüfen, ob ein bestimmter Name in einer der Listen gespeichert ist. Wie kann ich das tun? Lassen Sie es mich wissen, wenn Sie mich brauchen, um näher ins Detail zu gehen oder Verwirrung zu beseitigen.

Danke.

+1

+1 Sheesh! Eine Reihe von Antworten, aber keiner der Antworter hat sich die Mühe gemacht, die Frage zu beantworten? Ein Upvote bedeutet, dass die Frage gut geschrieben und spezifisch ist und zeigt, was der Benutzer bereits versucht hat. Diese Frage erfüllt alle Voraussetzungen für eine Upvote. –

+0

@Jim ... :) Danke! Wow ... es fühlt sich wirklich gut an, dass mich endlich jemand so erkennt. Vielen Dank ... Ich wünschte, einige mehr Menschen dachten wie du :) Danke! +1 für die Angabe, dass meine Frage alle Anforderungen für eine Upvote erfüllt. – Hristo

+0

@ Jim Garrison Sie haben Recht, aber für mich gibt es zwei weitere Anforderungen - die Frage sollte hart sein, und von gemeinsamem Interesse - d. H. Wenn Sie das Problem haben, sollte Googeln zu dieser Frage führen. – Bozho

Antwort

4

Kurz gesagt, ich möchte die HashMap durchlaufen und prüfen, ob ein bestimmter Name in einer der Listen gespeichert ist. Wie kann ich das tun?

Es gibt zwei Möglichkeiten, die Karte zu durchlaufen, die hier von Interesse sein könnten. Erstens können Sie alle Zuordnungen (d. H. Paare von Schlüssel/Wert-Beziehungen) unter Verwendung der entrySet()-Methode durchlaufen, wodurch Sie wissen, was der Schlüssel für jede Arraylist ist. Alternativ, wenn Sie den Schlüssel nicht benötigen, können Sie einfach alle Listen nacheinander über die Methode values() abrufen. Mit der ersten Option könnte wie folgt aussehen:

for (Map.Entry<String, ArrayList<String>> entry : theAccused.entrySet()) 
{ 
    String sListName = entry.getKey(); 
    ArrayList<String> saAccused = entry.getValue(); 
    if (saAccused.contains(sAccuser)) 
    { 
     // Fire your logic for when you find a match, which can 
     // depend on the list's key (name) as well 
    } 
} 

die breiteren Fragen zu beantworten - die Set Schnittstelle einfach stellt eine (ungeordnete) Sammlung von nicht-duplizierte Werten. Wie Sie dem verknüpften Javadoc entnehmen können, gibt es Methoden, die Sie für eine solche ungeordnete Sammlung erwarten könnten. Ein Iterator ist ein Objekt, das eine Datenstruktur durchläuft, die wiederum jedes Element darstellt.Typische Verwendung eines Iterators aussehen würde, etwa wie folgt:

Iterator<?> it = ...; // get the iterator somehow; often by calling iterator() on a Collection 
while (it.hasNext()) 
{ 
    Object obj = it.next(); 
    // Do something with the obj 
} 

das heißt, überprüfen, ob der Iterator nonexhausted (mehr Elemente hat), dann rufen Sie die next() Methode, dieses Element zu erhalten. Da das obige Muster jedoch so häufig ist, kann es mit foreach loop von Java 5 verglichen werden, so dass Sie nicht mit dem Iterator selbst arbeiten müssen, wie ich in meinem ersten Beispiel ausgenutzt habe.

+0

Wow ... Danke für diese Antwort! Schnelle Frage ... wenn du 'Iterater it = ...; 'sagst, ist es gleich einem Element, in meinem Fall ist es gleich einem Element aus dem Set? Danke für den Link zu 'for-each'. Ich habe es nie benutzt. Stellar Antwort! – Hristo

+0

Auch ... wenn wir zu Ihrer for-Schleife zurückkehren ... wenn ich eine Übereinstimmung finde, wie kann ich den Namen (Schlüssel) der ArrayList, die 'sAcccuser' enthält, extrahieren? – Hristo

+1

@Hristo - die 'it'-Variable wäre ein Objekt, das jedes Mal, wenn seine 'next()' -Methode aufgerufen wird, aufeinanderfolgende Elemente der zugrundeliegenden Sammlung zurückgibt, nicht ein Element selbst. Was Ihre zweite Frage anbelangt, habe ich mein Beispiel geändert, um es mit 'entrySet()' zu zeigen, da dies die Art ist, über eine Map zu iterieren, wenn Sie beide Werte * und * für Schlüssel interessieren. –

0

Sie müssen den Wert von Iterator.next() verwenden, um in die Map zu indizieren.

String key = iterAccusers.next(); 
saTheAccused = theAccused.get(key); 

Derzeit Sie bekommen Werte aus dem Map basierend auf dem Iterator, nicht die von der Iterator zurückgegebenen Werte.

3

So ähnlich?

saTheAccused = theAccused.get(iterAccused.next()); 

jedoch der Code besser lesbar zu machen, können Sie entweder:

for (List<String> list : theAccused.values()) { 
    if (list.contains("somename")) { 
     // found somename 
    } 
} 
2

Dies sollte es funktioniert

for (List<String> values : theAccused.values()) { 
    if (value.contains(sAcuser)) { 
     .. 
    } 
} 

oder, wenn Sie den Schlüssel brauchen:

for (String key : theAccused.keySet()) { 
    List<String> accused = theAccused.get(key); 
    if (accused.contains(sAccuser)) { 
    } 
} 
+0

Danke. Das habe ich gebraucht. Überarbeiten Sie jedoch Ihre Antwort ... Ich war auf der Suche nach einer ArrayList ... Ich möchte nicht, dass Sie aus einem dummen Grund abgelehnt werden :) – Hristo

+0

@Hristo Sie erhalten eine 'ArrayList', aber Sie verweisen es über seine Schnittstelle -' Liste ", was als eine bessere Praxis angesehen wird (außer Sie brauchen wirklich die Methoden, die für' ArrayList' spezifisch sind) – Bozho

+2

Wenn Sie sowohl den Schlüssel als auch den Wert benötigen, sollten Sie den EintragSet verwenden, anstatt den SchlüsselSet und ein Get. – ILMTitan

0

eine Methode machen, dass es funktioniert:

private String findListWithKeyword(Map<String, ArrayList<String>> map, String keyword) { 
    Iterator<String> iterAccusers = map.keySet().iterator(); 
    while(iterAccusers.hasNext()) { 
     String key = iterAccusers.next(); 
     ArrayList<String> list = theAccused.get(key); 
     if (list.contains(keyword)) { 
     return key; 
     } 
    } 
} 

Und wenn Sie die Methode aufrufen:

String key = findListWithKeyword(map, "foobar"); 
ArrayList<String> theCorrectList = map.get(key); 
+0

.. danke für Ihre Antwort. Ich schreibe bereits eine Methode, die das macht. Das ist der Punkt meiner Frage :) Schnelle Frage ... wenn Sie sagen: Iterater iterAccusers = ...; ', ist iterAccusers gleich einem Element, in meinem Fall ist es gleich einem Element aus dem Set, oder ist es zunächst nicht initialisiert? – Hristo

+0

Noch eine Frage ... wenn ich eine Übereinstimmung finde, wie kann ich den Namen (Schlüssel) der ArrayList, die 'sAcccuser' enthält, extrahieren? – Hristo

+0

iterAccusers ist ein Iterator, d. H. Sie können next() darauf aufrufen und das nächste Element abrufen. Es ist wie eine For-Each-Schleife. Der Iterator ist kein Element in der Menge, es ist ein Objekt, das verwendet wird, um durch die Menge zu iterieren. Wie zum Extrahieren des Schlüssels. Senden Sie den Schlüssel nicht einfach zurück, sondern senden Sie ihn zurück. Sehen Sie den bearbeiteten Code. – Jes

0

Es klingt wie Sie zwei Dinge tun müssen: Erstens, herauszufinden, ob ein bestimmter Name ist "angeklagt", und zweitens, finden Sie heraus, wer der Ankläger ist. Dazu müssen Sie über die Entry-Objekte in Ihrer Map iterieren.

In dieser Schleife enthält das Entry-Objekt eine einzelne Schlüsselwertzuordnung. So enthält entry.getValue() die Liste von Angeklagten, und entry.getKey() enthält ihren Ankläger.

+0

.. Was ist ein Eintragsobjekt? Das ist mir noch nicht aufgefallen. – Hristo

+0

Es ist eigentlich eine innere Klasse der Karte. Der vollständige Klassenname ist java.util.Map.Entry. (Die JavaDoc ist hier: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html) Nach meiner Erfahrung wird es selten verwendet. In diesem Fall ist es jedoch sehr nützlich, und da es Teil der Map-API ist, gibt es keinen Grund, es nicht zu verwenden. – DeathB4Decaf

Verwandte Themen