El problema: mantener una relación bidireccional de muchos a uno entre los objetos de Java.Clase de colección similar a una base de datos simple en Java
Algo así como mapas de Google/bidi los Commons Collections, pero quiero permiten valores duplicados en el lado delantero, y tienen conjuntos de las claves de futuro como los valores reverso. Se utiliza algo como esto:
// 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 */ }
Los enfoques simples de Java son: 1. Mantener un solo lado de la relación, ya sea como un Map<Location, Region>
o una Map<Region, Set<Location>>
, y recoger la relación inversa por iteración cuando sea necesario; O, 2. Para crear un contenedor que mantenga los Mapas de ambos lados e interceptar todas las llamadas mutantes para mantener sincronizados a ambos lados.
1 es O (n) en lugar de O (log n), que se está convirtiendo en un problema. Empecé en 2 y estaba en las malezas inmediatamente. (¿Sabe cuántas formas diferentes hay para alterar una entrada en el Mapa?)
Esto es casi trivial en el mundo sql (la tabla de Ubicación obtiene una columna Indexada indexada). ¿Hay algo obvio que me falta que hace que sea trivial para los objetos normales?
Soy reacio a poner esto como una respuesta porque no sé lo que realmente está haciendo, pero por lo que vale, creo que solo está utilizando la estructura de datos incorrecta. Lo que describes no es un mapa o un conjunto, es un gráfico donde todos los vértices son adyacentes a cualquier número de otros vértices. Obtendrá un mejor modelo de programación + tiempo de ejecución mediante el uso de una estructura de datos de gráficos adecuada en lugar de unir conjuntos y mapas aleatoriamente. – Juliet
Probablemente. Todo lo que busco de Maps and Sets es la semántica básica y el rendimiento de log-n. Si una mejor estructura proporciona una "vista" vagamente map-ish de las cosas, perfecto. Estoy explorando http://jung.sourceforge.net/ gracias a una respuesta ahora eliminada y parece prometedora. – rgeorge
¿El costo de las inserciones es importante para usted? (Además, ¿te refieres a otherset en esa última línea?) – Stobor