Ist es eine schlechte Übung, verschachtelte HashMaps zu verwenden?

8

Lassen Sie mich mein Szenario erklären. Ich habe eine Hierarchie, die ich beibehalten muss. Unten finden Sie ein Bild, das diese Hierarchie zeigt. Ich werde nach dem Bild erklären.

%Vor%
  • Von A bis A1, A2... ist es eine one to many Beziehung
  • Von A1 bis A1.1, A1.2... ist es eine one to many Beziehung
  • Von A1.1 bis X und A1.2 bis Y ist es eine eins zu eins Beziehung.

Ich hatte es ursprünglich so entworfen, dass es mehrere HashMap s verwendet, um dies zu erhalten. Aber dann wurde mir schnell klar, dass das Aktualisieren zu einem extrem harten Job wird.

Mehrere HashMap s zu haben bedeutet, dass ich die Eindeutigkeit in den verschiedenen Beziehungen selbst handhaben muss. Zum Beispiel kann A1.1 auch in einem root B -Knoten existieren. Ich muss also A an A1.1 anhängen, damit ich die Eindeutigkeit sicherstellen kann. Jetzt, wenn ich den Wert A ändern muss, bin ich in größeren Schwierigkeiten, da ich dies verwendet habe, um alle Schlüssel in A als A_A1.1

zu qualifizieren

Jetzt denke ich, dass ich Nested HashMaps dafür verwenden kann. Der Code dafür lautet:

%Vor%

Ist diese Übung in Ordnung? Ich habe eine Menge Buchhaltung zu tun, da ich verschachtelte Hashes verwenden werde, aber zumindest CRUD und Eindeutigkeitsprobleme behandelt sich selbst.

Wenn das nicht in Ordnung ist, könnte jemand eine andere bessere Struktur vorschlagen, die ich benutzen kann?

    
Shrayas 23.03.2014, 06:55
quelle

2 Antworten

4

Sie möchten offensichtlich einen Baum modellieren. Dieser Baum ist nicht unbedingt explizit mit TreeMap verknüpft. Und zugegebenermaßen kann ich nicht sehen, wie eine TreeMap dabei helfen könnte, die ganze Struktur darzustellen (obwohl sie in den einzelnen Baumknoten verwendet werden könnte).

Sie könnten eine Klasse wie diese erstellen

%Vor%

(nur eine kurze Skizze)

Dann könnten Sie die Hierarchie so aufbauen

%Vor%

Dies würde Ihnen bereits erlauben, in der Hierarchie zu navigieren, und die Pflege der Beziehungen wäre ziemlich einfach.

Ich habe nicht ganz verstanden, was Sie über die "Einzigartigkeit" gesagt haben. Auf jeden Fall wird in einem solchen Baum jeder Knoten eindeutig durch den Pfad identifiziert. Sie könnten sogar eine Hilfsmethode wie

erstellen %Vor%

um schnell auf ein Objekt über die Sequenz von Knotennamen zuzugreifen.

Zur Seite: Wie bereits erwähnt, sind tief verschachtelte Karten (oder Listen oder Mengen) fraglich. Aber unabhängig davon sollten Sie immer Schnittstellen verwenden, wie in

%Vor%

Dies könnte für bestimmte Anwendungsfälle OK sein, aber abhängig von was genau Sie modellieren möchten (und insbesondere wenn es eine andere Ebene gibt), könnte dies bereits geschehen unbequem sein.

    
Marco13 23.03.2014, 13:25
quelle
2

Ihr Vorschlag ist nicht ratsam.

Unter der Annahme, dass Ihre Anforderungen in der Lage sein müssen, ein Element in O (log (n)) -Zeit basierend auf einem Schlüssel abzurufen. Ich würde vorschlagen, eine der folgenden Lösungen als eine bessere Lösung für dieses Problem zu verwenden:

  1. Verwenden Sie eine TreeMap, oder wenn Sie Nebenläufigkeit benötigen, verwenden Sie ConcurrentSkipListMap (dies wäre meine Nummer 1 zur Lösung Ihres Problems)
  2. Lassen Sie ein TreeSet die Schlüssel und eine separate HashMap enthalten, um zwischen den Schlüsseln und den Werten
  3. zu mappen
  4. Erstellen Sie eine Klasse, die das Mapping kapselt (d. h. einen HashMap Decorator), der die eindeutige Schlüsselüberprüfung rekursiv behandelt (auch hier ist der erste Ansatz erstrebenswerter)
eitanfar 23.03.2014 07:10
quelle

Tags und Links