Das Problem: Pflegen Sie eine bidirektionale Viele-zu-Eins-Beziehung zwischen Java-Objekten.Einfache Datenbank-ähnliche Erfassungsklasse in Java
So etwas wie die Google/Commons Sammlungen bidi Karten, aber ich möchte doppelte Werte auf der Vorderseite ermöglichen und Sätze der vorderen Tasten wie die Rückseite Werte aufweisen. Gebraucht etwas wie folgt aus:
// maintaining disjoint areas on a gameboard. Location is a space on the
// gameboard; Regions refer to disjoint collections of Locations.
MagicalManyToOneMap<Location, Region> forward = // the game universe
Map<Region, <Set<Location>>> inverse = forward.getInverse(); // live, not a copy
Location parkplace = Game.chooseSomeLocation(...);
Region mine = forward.get(parkplace); // assume !null; should be O(log n)
Region other = Game.getSomeOtherRegion(...);
// moving a Location from one Region to another:
forward.put(parkplace, other);
// or equivalently:
inverse.get(other).add(parkplace); // should also be O(log n) or so
// expected consistency:
assert ! inverse.get(mine).contains(parkplace);
assert forward.get(parkplace) == other;
// and this should be fast, not iterate every possible location just to filter for mine:
for (Location l : mine) { /* do something clever */ }
Die einfache Java-Ansätze sind: 1. Um nur eine Seite der Beziehung zu pflegen, entweder als Map<Location, Region>
oder ein Map<Region, Set<Location>>
, und die inverse Beziehung von Iteration zu sammeln, wenn erforderlich; Oder 2. Einen Wrapper erstellen, der die Maps beider Seiten verwaltet und alle mutierenden Aufrufe abfängt, um beide Seiten synchron zu halten.
1 ist O (n) anstelle von O (log n), was ein Problem wird. Ich begann mit 2 und war sofort im Unkraut. (Wissen Sie, wie viele verschiedene Möglichkeiten es gibt, einen Map-Eintrag zu ändern?)
Dies ist fast trivial in der SQL-Welt (Location-Tabelle erhält eine indizierte RegionID-Spalte). Gibt es etwas Offensichtliches, das ich vermisse, das es für normale Objekte trivial macht?
Ich zögere, dies als eine Antwort zu setzen, weil ich nicht weiß, was Sie tatsächlich tun, aber für was es wert ist, denke ich, dass Sie nur die falsche Datenstruktur verwenden. Was Sie beschreiben, ist keine Map oder eine Menge, sondern ein Graph, bei dem alle Ecken einer beliebigen Anzahl anderer Ecken benachbart sind. Sie erhalten ein besseres Programmiermodell und eine bessere Laufzeit, indem Sie eine geeignete Diagrammdatenstruktur verwenden, anstatt Sätze und Karten willkürlich zusammen zu kleben. – Juliet
Wahrscheinlich. Alles, was ich von Maps and Sets herhabe, ist die sehr grundlegende Semantik und die Log-n-Leistung. Wenn eine bessere Struktur eine vage kartografische "Ansicht" der Dinge bietet, perfekt. Ich erforsche http://jung.sourceforge.net/ dank einer jetzt gelöschten Antwort und es sieht vielversprechend aus. – rgeorge
Sind Ihnen die Kosten der Einfügung wichtig? (Meinst du auch, dass andere in dieser letzten Zeile stehen?) – Stobor