4 Stimmen

Zwei-Wege-Mapping mit einer einzigen Datenstruktur

Vor kurzem bin ich bei der Arbeit auf einen Code gestoßen, der dem nachstehenden Code ähnelt (der nachgebildet wurde, um dem zu entsprechen, mit dem ich zu tun habe)

Gibt es eine Möglichkeit, den unten stehenden Code zu überarbeiten, um eine Datenstruktur zu verwenden (mit Blick auf die Leistung)?

Hier ist etwas Code, um 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);
    }

}

5voto

Yishai Punkte 87548

Diese Frage wird beantwortet aquí mit der Empfehlung zur Verwendung von BiMap von Google-Sammlungen

2voto

Uri Punkte 86472

Apache collections unterstützt eine BidiMap Schnittstelle und eine Vielzahl von recht effektiven Implementierungen.

2voto

Craig P. Motlin Punkte 26028

Sie können verwenden BiMap de Eclipse-Kollektionen .

BiMap ist eine Karte, die es den Nutzern ermöglicht, Nachforschungen in beide Richtungen anzustellen. Sowohl die Schlüssel als auch die Werte in einer BiMap sind eindeutig.

Die wichtigste Umsetzung ist HashBiMap .

inverse()

BiMap.inverse() gibt eine Ansicht zurück, bei der die Position des Schlüsseltyps und des Werttyps vertauscht sind.

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, außer dass sie auslöst, 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 stillschweigend den Map-Eintrag mit demselben Wert, bevor es das Schlüssel-Wert-Paar in die Map einfügt.

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);

Anmerkung: Ich bin ein Committer für die Eclipse-Sammlungen.

1voto

Tom Hawtin - tackline Punkte 142461

Sie könnten eine einzelne Map<Object,Object> um beide Zuordnungen vorzunehmen. Hässlich, sicher. Die Leistung sollte in etwa die gleiche sein, oder etwas besser in dem unwahrscheinlichen Fall, dass Sie viele ObjectMapper s mit wenigen zugeordneten Werten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X