Welche Java-Datenstruktur eignet sich am besten für das Zwei-Wege-Multi-Value-Mapping?

9

Ich bin relativ neu in Java und habe eine Frage, welche Art von Datenstruktur für meinen Fall am besten ist. Ich habe eine Menge von Daten, die im wesentlichen Schlüssel-Wert-Paare sind, jedoch kann jeder Wert mehreren Schlüsseln entsprechen und jeder Schlüssel kann mehreren Werten entsprechen. Ein vereinfachtes Beispiel wäre:

  • Red-Apple
  • Grüner Apfel
  • Rote-Erdbeere
  • Grüne Trauben
  • Lila-Trauben

In Anbetracht des obigen Beispiels muss ich in der Lage sein, die Farbe der Äpfel zurückzugeben, die ich habe und / oder welche roten Früchte ich habe. Die tatsächlichen Daten werden dynamisch basierend auf einer Eingabedatei generiert, wobei jeder Satz irgendwo zwischen 100 und 100.000 Werten liegt und jeder Wert kann hunderten von Werten in dem anderen Satz entsprechen.

Was wäre der effizienteste Weg, um diese Daten zu speichern und zu analysieren? Ich würde eine Lösung vorziehen, die so ursprünglich wie Java ist und nicht etwa eine externe Datenbank.

Diese Frage ist verwandt, aber ich bin mir nicht sicher wie man die Lösung in meinem Fall anwendet, da ich jedem Schlüssel in beiden Richtungen mehrere Werte zuweisen müsste.

    
user4588937 20.02.2015, 17:52
quelle

3 Antworten

1

Ich schlage vor, dass Sie die Struktur von Guavas Table verwenden . Verwenden Sie die Farbe als Zeilenschlüssel und Obst als Spaltenschlüssel oder umgekehrt. Insbesondere ist HashBasedTable für Ihren Fall gut geeignet.

Gemäß Ihrem Anwendungsfall müssen Sie für die Werte nichts speichern. Diese Table s erlauben jedoch keine null -Werte. Sie könnten einen Dummy Boolean oder irgendeinen anderen statistischen nützlichen Wert verwenden, d. H. Datum und Zeit des Einfügens, Benutzer, Anzahl der Farbe / Frucht-Paare, etc.

Table verfügt über die erforderlichen Methoden wie column() und row() . Denken Sie daran, dass die Dokumente sagen, dass diese Strukturen für den Zeilenzugriff optimiert sind. Dies kann für Sie in Ordnung sein, wenn Sie mit einem Schlüssel mehr als mit dem anderen zugreifen möchten.

    
Federico Peralta Schaffner 20.02.2015, 22:46
quelle
3

Da du keine doppelten Schlüssel in Map haben kannst, kannst du stattdessen Map<Key, List<Value>> erstellen oder, wenn du kannst, Guava's Multimap .

%Vor%

Aber das Problem ist, dass Sie nicht nach den Schlüsseln eines bestimmten Objekts fragen können, ich werde weiter suchen und machen und bearbeiten, wenn ich etwas anderes finde, hoffe es hilft.

Sie können das Umgekehrte dennoch selbst durchführen, indem Sie die Karte iterieren und die Schlüssel für das Objekt finden.

    
Luke SpringWalker 20.02.2015 19:15
quelle
0

Sie können Ihre eigene benutzerdefinierte Datenstruktur erstellen

%Vor%

Die Ausgabe sollte

sein

Rot: [Apfel, Erdbeere]

Lila: [Trauben]

Grün: [Apfel, Trauben]

    
Anwuna 20.02.2015 20:25
quelle