2009-06-08 4 views
0
HashMap<Pair<Class<T>,Boolean>,String> abc = new HashMap<Pair<Class<T>,Boolean>,String>(); 

Ich habe zwei Ansätze hier ... erstellen Sie einen Schlüssel {Klasse, Boolean} -> {String} oder ich könnte dies auch tun.Composite Key v/s 2 Ebenen der Indirektion

{class} -> {Boolean, string}

der erste Ansatz hat 1 Dereferenzierungsebene, die der zweite Ansatz 2 hat ... was sind die Vor- und Nachteile hier? Ist der zweite Ansatz schlecht?

+0

Eine Karte ist eine Funktion, so dass die Der natürlichste Weg, um das zu tun, was Sie wollen, hängt von der Geschäftslogik ab, die wir nicht kennen, also ... was machst du? – akappa

+0

Der Client benötigt Zugriff auf den Wert (String) und die Abfragerate beträgt 5000/Sek. entweder Map << class, boolean>, string> oder Map >. – user117736

+0

Was repräsentieren die Klassen? Kann man das in den eigentlichen Klassen selbst machen? –

Antwort

2

Idealerweise hängt die Wahl am besten von dem ab, was für die Problem-/Lösungsdomäne natürlich ist. Stellt der Schlüssel < class, Boolean > irgendetwas in der Domäne dar? Ist Map < Boolean, String > für alles in der Domäne? Die Verwendung von 1-Level- oder 2-Level-Indirection kann ein Implementierungsdetail sein, das Sie am Ende verstecken möchten.

Wenn es jedoch eine reine Leistungsentscheidung ist, alle anderen Dinge gleich sind (zB Zugriffsmuster nicht in die eine oder andere Richtung, gute Hash-Funktion, spärliche Map, etc.), würde ich HashMap < Key denken < X, Y >, Z> wäre schneller als HashMap < X, Karte < Y, Z > > - Ich möchte denken, dass 1 Nachschlagen in einer größeren HashMap schneller ist als 2 Suchen in kleineren Karten.

Da Sie einen boolean Schlüssel haben, sollte auch 2 HashMap Tabellen (einen für wahr und einen für falsch) und einigen ternären Operator (:) Magie statt:

final Map<Class, String> falseMap = new HashMap<Class, String>(); 
final Map<Class, String> trueMap = new HashMap<Class, String>(); 

final String s = ((booleanKey ? trueMap: falseMap).get(classKey)); 
Verwandte Themen