Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Inverse HashMap-Suche

5 views
Skip to first unread message

Günther Frings

unread,
Jan 1, 2010, 8:19:43 AM1/1/10
to
Hallo,

eine kurze Frage: Wie erhalte ich von einer HashMap<A,B> die Keyklasse A,
wenn ich B besitze? Oder brauche ich dazu etwas anderes als HashMap?

HashMap<A,B> myHashMap = new HashMap<A,B>();
myHashMap.put(a1, b1);
myHashMap.put(a2, b2);
//...
bx = myHashMap.get(a1); // okay
if (myHashMap.containsValue(b2)) {
ax = myHashMap.getKeyOf(b2); // wie geht so etwas?
}

Grüße!

Jérôme Waibel

unread,
Jan 1, 2010, 9:00:57 AM1/1/10
to
Am 01.01.2010 14:19, schrieb Günther Frings:
> Hallo,
>
> eine kurze Frage: Wie erhalte ich von einer HashMap<A,B> die Keyklasse A,
> wenn ich B besitze? Oder brauche ich dazu etwas anderes als HashMap?

Apache-Commons-Collections BidiMap. Dir sollte aber klar sein dass da
deine Values dann auch gleichzeitig Keys sind diese eindeutig sein
müssen bzw. eben eine 1:1-Beziehung zwischen Key und Value existieren muss.

Wanja Gayk

unread,
Jan 1, 2010, 6:41:48 PM1/1/10
to
=?UTF-8?B?SsOpcsO0bWUgV2FpYmVs?= said...

> Am 01.01.2010 14:19, schrieb Gᅵ?nther Frings:
> > Hallo,
> >
> > eine kurze Frage: Wie erhalte ich von einer HashMap<A,B> die Keyklasse A,
> > wenn ich B besitze? Oder brauche ich dazu etwas anderes als HashMap?
>
> Apache-Commons-Collections BidiMap. Dir sollte aber klar sein dass da
> deine Values dann auch gleichzeitig Keys sind diese eindeutig sein
> mᅵ?ssen bzw. eben eine 1:1-Beziehung zwischen Key und Value existieren muss.


Eine Mᅵglichkeit ist es 2 Maps zu nehmen:
Map<K,V> keyValueMap = ...
Map<V,K> valueKeyMap = ...

void put(K k,V v){
keyValueMap.put(k, v);
valueKeyMap.put(v, K);
}
//..

Ein Vorschlag wᅵre auch, Wert und Schlᅵssel in einem gemeinsamen Object
zu halten:

Map<K, V> map = ..

Map.Entry<K, V> get(final K key){
final V value = map.get(key);
return new Map.Entry<K,V>(){
K getKey(){return key;}
V getValue(){return value;}
}
}
}

Und drauᅵen schmeiᅵt man dann halt die Map.Entry Objekte hin und her.

Gruᅵ,
-Wanja-


--
Klingon function calls do not have 'parameters', they have 'arguments' -
and they always win them.
[Nele Abels in dsg]

Günther Frings

unread,
Jan 4, 2010, 7:08:24 AM1/4/10
to
Hallo,

Danke für eure Hilfe. Ich habe jetzt folgende kleine Lösung meines
Problems entwickelt. Sie ist nicht sehr schnell (O(n)), aber da ich mit
kleinen Listen mit weniger als 20 Elementen zu tun habe, sollte es okay
sein.

public A getKeyByValue(B b) {
Set<Map.Entry<A, b>> entries = myMap.entrySet();
for (Map.Entry<A, B> entry: entries) {
if (entry.getValue() == b) {
return entry.getKey();
}
}
return null;
}

Ich wollte zunächst HashMap ableiten und diese Funktion direkt hinein
implementieren, aber irgendwie bekomme ich das nicht hin. Wenn ich
"extends HashMap" schreibe, meckert er, weil eine Typangabe fehlt.
Schreibe ich jedoch "extends HashMap<MeinTypA, MeinTypB>", dann meckert
er in meinen Methoden.

Grüße!

Christian

unread,
Jan 4, 2010, 9:43:41 AM1/4/10
to

du soltest die Joker beibehalten..

i.e. BiDiHashMap<K,V> extends HashMap<K,V>

und dann eben bei der instantiierung wieder die typen mitgeben...

Marcel Huntemann

unread,
Jan 6, 2010, 2:22:57 PM1/6/10
to
Hi!

Auch google hat hierfuer gerade eine API "finalized":
http://code.google.com/p/google-collections/

LG,
Marcel

0 new messages