Discussion:
HashMap mit containsValue überprüfen
(zu alt für eine Antwort)
s.jo
2005-03-18 16:50:27 UTC
Permalink
Hallo,

ich erzeuge einen Eintrag in einen HashMap wie folgt:

"String: wort" - key
"String[]: frequenz, bezeichnung".

Wie kann ich mit den HashMap überprüfen, ob dieser den Wert "bezeichnung"
besitzt?

Danke

jose k.
s.jo
2005-03-18 16:55:27 UTC
Permalink
und nachträglich:

wie kann ich dann, wenn dieser Fall zutrifft, den betreffenden Key hollen?
Post by s.jo
Hallo,
"String: wort" - key
"String[]: frequenz, bezeichnung".
Wie kann ich mit den HashMap überprüfen, ob dieser den Wert "bezeichnung"
besitzt?
Danke
jose k.
Dirk Dittert
2005-03-18 17:49:41 UTC
Permalink
Hallo s,

Bitte beachten:
<http://www.afaik.de/usenet/faq/zitieren/download/zitieren-alles.html>

Was willst Du genau machen? Möchtest Du wissen, ob in einer HashMap ein
Wert zum Schlüssel "wort" ist, der auch eine Bezeichnung enthält?
Möchtest Du die Schlüssel für alle Werte, die eine Bezeichnung haben?

Ersteres wäre zum Beispiel:

HashMap myMap = new HashMap();
...
final String[] result = myMap.get("wort");
if (result == null) {
System.out.println("Kein Eintrag für key wort");
} else {
assert(result != null && result.length == 2);
if (result[1] != null) {
System.out.println("Key wort hat Bezeichnung: " + result[1]);
} else {
System.out.println("Key wort hat keine Bezeichnung");
}
}

Das it aber eigentlich nur dazu da, daß Du siehst, wie man es machen
_könnte_. So einsetzen würde ich das auf keinen Fall, weil es ziemlich
mit heißer Nadel gestrickt ist.

Hinweis: Wer String Arrays in eine HashMap packt, möchte in der Regel
die verwendeten Datenstrukturen nochmal überdenken. Insbesondere klingt
mir frequenz nicht so, als würde man die als String abspeichern wollen.

Viele Grüße,

Dirk Dittert
Sven Köhler
2005-03-18 18:02:09 UTC
Permalink
Post by s.jo
wie kann ich dann, wenn dieser Fall zutrifft, den betreffenden Key hollen?
Imdem du die DualBidiHashMap von den jakarta comonns collections benutzt.
Achim Peters
2005-03-18 18:37:14 UTC
Permalink
Post by s.jo
Hallo,
"String: wort" - key
"String[]: frequenz, bezeichnung".
Wie kann ich mit den HashMap überprüfen, ob dieser den Wert "bezeichnung"
besitzt?
Meinst Du, ob ein beliebiger Eintrag der Hashmap den Wert "bezeichnung"
besitzt?

Na mit containsValue(), hast Du ja schon im Betreff geschrieben.
Allerdings würde das bei Deinem Beispiel ein false liefern, wenn das der
einzige Eintrag wäre, denn der Eintrag besitzt ja nicht den Wert
"bezeichnung", sondern {"frequenz", "bezeichnung"}.

Für das was Du vermutlich möchtest, müsstest Du in einer Schleife über
alle Values gehen und dann jedesmal alle Elemente des Stringarrays
abklappern.

Oder Du machst Dir eine zweite, quasi invertierte Hashmap, falls die
Werte eindeutig sind.

Bye
Achim
Sven Köhler
2005-03-18 18:50:26 UTC
Permalink
Post by s.jo
"String: wort" - key
"String[]: frequenz, bezeichnung".
Wie kann ich mit den HashMap überprüfen, ob dieser den Wert "bezeichnung"
besitzt?
Ach so, momente mal! du hast da sowas wie eine HashBag? D.h. einem Key
sind mehrere Values zugeordnet. Du kannst über das entrySet iteratieren,
und dann die Values durchsuchen. Effizienter geht es nicht, aber wenn du
das Value gefunden hast, kannste du das Entry auch nach dem Key fragen.
s.jo
2005-03-18 19:28:43 UTC
Permalink
Das Iterieren wollte ich vermeiden, da es einige Zeit in Anspruch nimmt -
Habe ich auch schon probiert.

Könnte man bei dem containsValue(Objekt) [Objekt besteht aus dem erwähnten
Array String[] = {"frequenz","bezeichnung"}] die Methode so modifizieren,
dass nur das zweite Array-Element verglichen wird, oder wird dabei das
Objekt als ganzes verglichen und nicht die einzelnen Variablen?
Post by Sven Köhler
Post by s.jo
"String: wort" - key
"String[]: frequenz, bezeichnung".
Wie kann ich mit den HashMap überprüfen, ob dieser den Wert "bezeichnung"
besitzt?
Ach so, momente mal! du hast da sowas wie eine HashBag? D.h. einem Key
sind mehrere Values zugeordnet. Du kannst über das entrySet iteratieren,
und dann die Values durchsuchen. Effizienter geht es nicht, aber wenn du
das Value gefunden hast, kannste du das Entry auch nach dem Key fragen.
Sven Köhler
2005-03-18 19:31:17 UTC
Permalink
Post by s.jo
Das Iterieren wollte ich vermeiden, da es einige Zeit in Anspruch nimmt -
Habe ich auch schon probiert.
containsValue iteriert auch nur. du sparst also keine zeit, indem du
containsValue benutzt.
s.jo
2005-03-18 19:36:30 UTC
Permalink
dann habe ich etwas falsches gemacht. Muss ist wohl vergessen haben die
Iteration abzubrechen wenn das Element gefunden wird!!!
Post by Sven Köhler
Post by s.jo
Das Iterieren wollte ich vermeiden, da es einige Zeit in Anspruch nimmt -
Habe ich auch schon probiert.
containsValue iteriert auch nur. du sparst also keine zeit, indem du
containsValue benutzt.
Ingo R. Homann
2005-03-21 08:01:31 UTC
Permalink
Hi s.jo,
Post by s.jo
dann habe ich etwas falsches gemacht. Muss ist wohl vergessen haben die
Iteration abzubrechen wenn das Element gefunden wird!!!
Das bringt im Mittel aber auch nicht viel Performance. Nimm lieber die
schon vorgeschlagene BiDi-Map, und guck dir die Interfaces Comparable
und Comparator an.

Ciao,
Ingo

Frank Dreyer
2005-03-19 01:54:39 UTC
Permalink
Post by s.jo
"String: wort" - key
"String[]: frequenz, bezeichnung".
Wie kann ich mit den HashMap überprüfen, ob dieser den Wert "bezeichnung"
besitzt?
Eine effektivere Lösung als das iterieren wäre ein Wrapper oder eine
Subklasse:

class ... extends HashMap {
Map valueToKeys = new HashMap();

public Object put(Object key, Object value) {
super.put(key, value);
for(String aValue : value) {
valueToKeys.put(aValue, key);
}
}

public boolean containsValue(String value) {
return valueToKeys.containsKey(value);
}

public String findKey(String value) {
return valueTokeys.get(value);
}
}

Generics oder casts darfst du selbst noch einfügen...
Loading...