2010-06-22 15 views
9

La clase MultiValueMap (colecciones comunes de Apache) facilita el trabajo con un Mapa cuyos valores son Colecciones. Estoy buscando una clase que facilite el trabajo con un mapa cuyas claves son objetos y valores son mapas.Mapa de la estructura de datos de Maps

Estoy usando Java 1.4, por lo que no puedo usar colecciones de Google ni genéricos.

+0

¿De qué lado necesitas ser un mapa? ¿Está mapeando de un mapa a otro, de un objeto a un mapa o de un mapa a un mapa? – MikeD

+0

¿No puedes simplemente hacer Map ? ¿O desea poder hacer algo como map.put (key1, key2, value)? – Dave

+0

No es que sea excesivamente relevante, supongo, pero tengo curiosidad: ¿Qué empresa/industria (tan específicamente como se siente cómodo diciéndonos) todavía necesita Java 1.4? Incluso Java 5 ha sido al final de la vida. Java 1.4 ya tiene EOLd desde hace casi 2 años. –

Respuesta

7

El mapa de mapas es en realidad una estructura tipo árbol sin un solo nodo raíz (así como un mapa de mapas de mapas ...).

Puedes mirar Composite pattern que es ampliamente utilizado para implementar estructuras de árbol (si sus componentes tienen el mismo tipo que no es el caso como me siento).

Otra solución es implementar un modelo de dominio simple. Será mucho más fáciles de interpretar y fácil de mantener algo como:

school.getPupil ("John Doe").getMark ("Math") 

que

school.get ("John Doe").get ("Math") 
4

La colección Mapa regulares que funciona para esto:

Map<Object,Map<Object,Object>> mapOfMaps = new LinkedHashMap<Object,Map<Object,Object>>(); 
    Object newObject = new String("object as string"); 
    mapOfMaps.put(newObject, new LinkedHashMap<Object,Object>()); 
    Map<Object,Object> objectMap = mapOfMaps.get(newObject); 

De hecho, si no está preocupado por la seguridad del tipo, puede poner lo que quiera en la sección de valor:

Map<Object,Object> mapOfWhatever = new LinkedHashMap<Object,Object>(); 
    Object newObject = new String("object as string"); 
    mapOfWhatever.put(newObject, new LinkedHashMap<Object,Object>()); 
    Map<Object,Object> objectMap = (Map<Object, Object>) mapOfWhatever.get(newObject); 
+0

Normalmente, uno no quiere tener importar si una determinada (primera) clave ya está en 'mapOfMaps', por ejemplo al hacer 'mapOfMaps.get (" firstKey "). put (" secondKey ", value)'. Por ejemplo, los mapas de Python tienen un [método 'setdefault'] (http://docs.python.org/2/library/stdtypes.html#dict.setdefault) para este propósito. –

1

Si tiene map:{string,map:{string,thing}} (deliberadamente no usando la sintaxis de Java para evitar el negocio completo de Java1.4/Java5), entonces también debería considerar si debe modelar eso como map:{tuple:{string,string},thing}. Si dominan las búsquedas de varios niveles, entonces es un buen cambio (siempre que implemente una buena tuple que haga equals() correctamente y hashCode() inteligentemente) pero si está haciendo muchas inserciones y eliminaciones, entonces es menos bueno.

La inteligencia en hashCode probablemente signifique crear una forma razonable de mezclar los bits de los hashCodes de los contenidos. Si se espera que los valores de los miembros provengan de conjuntos disjuntos (por ejemplo, nombres y ocupaciones), entonces puede simplemente XOR juntos, imperfectos, pero baratos y rápidos, pero si tiene menos control/certeza, entonces necesita hacer algo más como bien (por ejemplo, rotar los bits de uno de los valores antes del XOR).

Cuestiones relacionadas