185 Stimmen

Wie implementiert man eine Karte mit mehreren Schlüsseln?

Ich brauche eine Datenstruktur, die sich wie eine Map verhält, aber mehrere (unterschiedlich typisierte) Schlüssel für den Zugriff auf ihre Werte verwendet.
(Lassen Sie uns nicht zu allgemein sein, sagen wir zwei Tasten)

Die Einzigartigkeit der Schlüssel ist garantiert.

Etwa so:

MyMap<K1,K2,V> ...

Mit Methoden wie:

getByKey1(K1 key)...
getByKey2(K2 key)...
containsKey1(K1 key)...
containsKey2(K2 key)...

Haben Sie irgendwelche Vorschläge?

Das Einzige, was mir einfällt, ist:
Schreiben Sie eine Klasse, die intern zwei Maps verwendet.

EDIT Einige Leute schlagen mir vor, eine Tupel , a Paar oder ähnlich als Schlüssel für Java's Map, aber das würde nicht funktionieren für mich:
Ich muss, wie oben geschrieben, in der Lage sein, Werte nur nach einem der beiden angegebenen Schlüssel zu suchen.
Maps verwenden Hash-Codes von Schlüsseln und überprüfen deren Gleichheit.

0 Stimmen

Ich bin erstaunt, dass diese Frage trotz fast 200.000 Aufrufen noch nicht verbessert wurde.

1voto

VasiliyL Punkte 989

Wenn die Schlüssel eindeutig sind, gibt es keinen Bedarf für 2 Maps, Map of Maps, MapOfWhateverThereIs. Es muss nur eine einzige Map geben und nur eine einfache Wrapper-Methode, die Ihre Schlüssel und Werte in diese Map einfügen würde. Beispiel:

Map<String, String> map = new HashMap<>();

public void addKeysAndValue(String key1, String key2, String value){
    map.put(key1, value);
    map.put(key2, value);
}

public void testIt(){
    addKeysAndValue("behemoth", "hipopotam", "hornless rhino");
}

Verwenden Sie dann Ihre Karte wie gewohnt. Sie brauchen nicht einmal diese schicken getByKeyN und containsKeyN.

1 Stimmen

Dies ist eine wirklich elegante (Teil-)Lösung, aber die Schlüssel könnten von verschiedenen Typen sein (wie die Frage sagt "Ich brauche eine Datenstruktur, die sich wie eine Map verhält, aber mehrere (anders getippt) Schlüssel, um auf seine Werte zuzugreifen.")

0 Stimmen

Seltsamerweise habe ich Ihre Antwort im Jahr 2019 nicht mehr gesehen. Für anders getippte Schlüssel würde ich... ein Objekt verwenden? Wie, Map<Object, String>?

1 Stimmen

Das ist wirklich eine elegante Lösung! Für Schlüssel mit verschiedenen Typen, finden Sie einen Weg, um sie alle in String mit einem Präfix/Suffix/Transformation zu konvertieren

1voto

duffymo Punkte 298898

Klingt wie ein Python-Tupel. In diesem Sinne können Sie eine unveränderliche Klasse Ihrer Wahl erstellen, die Comparable implementiert, und schon haben Sie es.

0voto

3xCh1_23 Punkte 1405

Eine schmutzige und einfache Lösung, wenn Sie die Maps nur zum Sortieren verwenden, ist es, einen sehr kleinen Wert zu einem Schlüssel hinzuzufügen, bis der Wert nicht mehr existiert, aber fügen Sie nicht das Minimum hinzu (z.B. Double.MIN_VALUE), da dies einen Fehler verursachen wird. Wie ich schon sagte, ist dies eine sehr unsaubere Lösung, aber sie macht den Code einfacher.

0voto

user2856450 Punkte 1

Wie wäre es, eine Trie-Datenstruktur zu verwenden?

http://en.wikipedia.org/wiki/Trie

Die Wurzel des Versuchs wird leer sein. Die Geschwister der ersten Ebene sind die primären Schlüssel der Map, die Geschwister der zweiten Ebene sind die sekundären Schlüssel und die dritte Ebene sind die Endknoten, die den Wert null haben, um das Ende des Zweigs anzuzeigen. Sie können auch mehr als zwei Schlüssel nach demselben Schema hinzufügen.

Nachschlagen ist einfach DFS.

0voto

moinudin Punkte 125641

Definieren Sie eine Klasse, die eine Instanz von K1 und K2 hat. Verwenden Sie dann diese Klasse als Ihren Schlüsseltyp.

0 Stimmen

Das Gleiche gilt für die Suche nach K1 oder K2, was ein Problem mit der Gleichheit der Schlüssel darstellt.

0 Stimmen

In C++ könnte man den Gleichheitstest überschreiben, so dass er wahr ist, wenn eines der beiden Elemente gleich ist, anstatt der Vorgabe, dass er nur wahr ist, wenn beide gleich sind. Ist das in Java nicht möglich?

2 Stimmen

Es ist durchaus möglich, aber es könnte nicht die gewünschte Wirkung haben; wenn Ihre Map-Implementierung auf das Objekt Hash-Code, wie in einer HashMap, dann, dass alles zur Hölle schraubt.

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