Problem: Utrzymywanie dwukierunkowej relacji wielu do jednego między obiektami Java.Prosta klasa kolekcji podobna do bazy danych w języku Java
coś jak Google/Commons Collections BiDi map, ale chcę pozwalają zduplikowane wartości na przedniej stronie i mieć zestawy z przodu kluczy jako odwróconych wartości ubocznych. Używane coś takiego:
// 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 */ }
prostych metodach java: 1. Aby zachować tylko jedną stronę relacji, zarówno jako Map<Location, Region>
lub Map<Region, Set<Location>>
i zebrać odwrotną zależność od iteracji, gdy są potrzebne; Lub 2. Aby utworzyć opakowanie zachowujące mapy obu stron i przechwytywać wszystkie wywołania mutacji, aby obie strony były zsynchronizowane.
1 to O (n) zamiast O (log n), co staje się problemem. Zacząłem od 2 i od razu znalazłem się w chwastach. (Wiesz, ile różnych sposobów modyfikacji wpisu mapy?)
Jest to prawie banalne w świecie sql (tabela Lokalizacja pobiera indeksowaną kolumnę RegionID). Czy jest coś oczywistego, czego mi brakuje, co czyni go trywialnym dla normalnych obiektów?
Nie chcę tego ująć jako odpowiedzi, ponieważ nie wiem, co właściwie robisz, ale na ile jest to warte, myślę, że używasz niewłaściwej struktury danych. To, co opisujesz, nie jest mapą ani zbiorem, jest to wykres, w którym wszystkie wierzchołki sąsiadują z dowolną liczbą innych wierzchołków. Otrzymasz lepszy model programowania + środowisko wykonawcze, używając odpowiedniej struktury danych wykresu, zamiast sklejać ze sobą zestawy i mapy w sposób chaotyczny. – Juliet
Prawdopodobnie. Wszystko, czego oczekuję od Map and Sets, to bardzo podstawowa semantyka i wydajność log-n. Jeśli lepsza struktura zapewnia niejasny "widok" rzeczy, idealny. Eksploruję http://jung.sourceforge.net/ dzięki usuniętej odpowiedzi i wygląda obiecująco. – rgeorge
Czy koszt wstawek jest dla ciebie ważny? (Co więcej, masz na myśli inny zestaw w ostatniej linii?) – Stobor