Il problema: mantenere una relazione bidirezionale bidirezionale tra gli oggetti java.Classe di raccolta semplice simile a un database in Java
qualcosa come il Google/Commons Collezioni mappe bidi, ma voglio consentire valori duplicati sul lato in avanti, e hanno set dei tasti avanti come i valori di rovescio. qualcosa di usato in questo modo:
// 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 */ }
Le semplici approcci Java sono: 1. Per mantenere solo un lato della relazione, sia come Map<Location, Region>
o un Map<Region, Set<Location>>
, e raccogliere la relazione inversa per iterazione quando necessario; Oppure 2. Creare un wrapper che mantenga le mappe di entrambe le parti e intercettare tutte le chiamate mutanti per mantenere sincronizzati entrambi i lati.
1 è O (n) invece di O (log n), che sta diventando un problema. Ho iniziato il 2 e sono stato subito tra le erbacce. (Sapere quanti modi diversi ci sono per modificare una voce Mappa?)
Questo è quasi banale nel mondo sql (la tabella di posizione ottiene una colonna RegionID indicizzata). C'è qualcosa di ovvio che mi manca che lo rende banale per gli oggetti normali?
Sono riluttante a mettere questa risposta come risposta perché non so cosa stai effettivamente facendo, ma per quello che vale, penso che tu stia usando solo la struttura dei dati sbagliata. Quello che descrivi non è una mappa o un set, è un grafico in cui tutti i vertici sono adiacenti a qualsiasi numero di altri vertici. Otterrai un modello di programmazione + tempo di esecuzione migliore utilizzando una struttura dati grafica adeguata anziché incollare insieme set e mappe a caso. – Juliet
Probabilmente. Tutto quello che voglio da Maps and Sets è la semantica di base e le prestazioni log-n. Se una struttura migliore fornisce una "visione" vagamente mappa delle cose, perfetto. Sto esplorando http://jung.sourceforge.net/ grazie ad una risposta ora cancellata e sembra promettente. – rgeorge
Il costo degli inserimenti è importante per te? (Inoltre, intendi otheret in quest'ultima riga?) – Stobor