Zwei-Wege-Mapping einzelne Datenstruktur
Frage
lief ich über einige Codes vor kurzem bei der Arbeit (neu erstellt ähnlich sein, was mit denen ich zu tun), ähnlich dem folgenden Code
Gibt es eine Möglichkeit ich den Code überarbeiten kann unter eine Datenstruktur zu verwenden (mit Leistung im Verstand)?
Hier ist ein Code zu veranschaulichen, was ich meine:
public class ObjectMapper {
private Map<UUID,Integer> uuidMap;
private Map<Integer,UUID> indexMap;
public ObjectMapper(){
uuidMap = new HashMap<UUID,Integer>();
indexMap = new HashMap<Integer,UUID>();
}
public void addMapping(int index, UUID uuid){
uuidMap.put(uuid, index);
indexMap.put(index, uuid);
}
.
.
.
public Integer getIndexByUUID(UUID uuid){
return uuidMap.get(uuid);
}
public UUID getUUIDByIndex(Integer index){
return indexMap.get(index);
}
}
Lösung
Dies wird beantwortet hier mit der Empfehlung bimap zu verwenden, um von Google Sammlungen
Andere Tipps
Apache Sammlungen unterstützt eine BidiMap Schnittstelle und eine Vielzahl von ziemlich effektiv Implementierungen.
Sie können eine einzelne Map<Object,Object>
verwenden beide Zuordnungen zu tun. Hässliche, sicher. Die Leistung soll in etwa gleich sein, oder etwas besser in dem unwahrscheinlichen Fall, dass Sie viele ObjectMapper
s mit einigen abgebildeten Werten haben.
Sie können mit bimap von Eclipse-Sammlungen .
BiMap
ist eine Karte, die Benutzer-Abfragen aus beiden Richtungen durchführen kann. Sowohl die Schlüssel und die Werte in einer bimap sind einzigartig.
Die Haupt Implementierung ist HashBiMap
.
inverse()
BiMap.inverse()
gibt eine Ansicht, in der die Position des Schlüsseltypen und Werttypen getauscht werden.
MutableBiMap<Integer, String> biMap =
HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3");
MutableBiMap<String, Integer> inverse = biMap.inverse();
Assert.assertEquals("1", biMap.get(1));
Assert.assertEquals(1, inverse.get("1"));
Assert.assertTrue(inverse.containsKey("3"));
Assert.assertEquals(2, inverse.put("2", 4));
put()
MutableBiMap.put()
verhält sich wie Map.put()
auf einer regulären Karte, es sei denn es wirft, wenn ein doppelter Wert hinzugefügt wird.
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.put(1, "1"); // behaves like a regular put()
biMap.put(1, "1"); // no effect
biMap.put(2, "1"); // throws IllegalArgumentException
forcePut()
Dies verhält sich wie MutableBiMap.put()
, aber es entfernt im Hintergrund die Karte Eintrag mit dem gleichen Wert, bevor das Schlüssel-Wert-Paar in der Karte setzen.
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.forcePut(1, "1"); // behaves like a regular put()
biMap.forcePut(1, "1"); // no effect
biMap.forcePut(1, "2"); // replaces the [1,"1"] pair with [1, "2"]
biMap.put(2, "2"); // removes the [1, "2"] pair before putting
Assert.assertFalse(biMap.containsKey(1));
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "1"), biMap);
. Hinweis: Ich bin ein Committer für Eclipse Sammlungen