HashMap de tres elementos sin iteración interna
-
06-07-2019 - |
Pregunta
¿Cuál es la mejor manera de implementar un hashMap de tres elementos? Por ejemplo, me gustaría usar una clave de cadena normal, pero hacer que se asigne a dos objetos diferentes. La idea es como tener una lista de listas, excepto que el primer elemento es una clave.
Estoy tratando de evitar iterar a través de la lista (por lo que el comportamiento es como un hashmap). ¿Estaría de acuerdo en que la única forma es construir una nueva Clase? Parece un " HashMap3 " Objeto (con métodos de get1 (clave) & amp; get2 (clave)) sería útil. No estoy seguro de cómo configurar esto yo mismo.
¿Cómo puedo crear la colección?
Solución
Si la clave siempre se asignará a exactamente dos objetos, entonces la forma más fácil de hacerlo es crear una clase Pair
que exista solo para contener los dos objetos. Luego usa su String como la clave y la instancia de Pair
como el valor. Sin embargo, si la clave puede correlacionarse arbitrariamente con muchos Objetos, entonces IMO, la mejor manera de hacerlo es tener el valor almacenado en el Map
ser una Collection
de algún tipo.
Otros consejos
Mire google-collections Multimap
Una colección similar a un Mapa, pero que puede asociar múltiples valores con una sola llave Si llamas put (K, V) dos veces, con la misma clave pero diferentes valores, el multimapa contiene asignaciones de la clave a ambos valores.
A hash de hashes quizás?
Estoy de acuerdo con Eddie, y tuve un problema similar solo con muchos valores, no con dos. Quería un Java ConcurrentHashMap para contener un XML de caché de documentos que se obtienen de un servicio web, y necesitaba registrar varias piezas de información junto con el XML para admitir las estrategias de desalojo del caché (por ejemplo, Menos utilizado recientemente, Menos utilizado con frecuencia).
La solución fue simplemente definir una clase de objeto que contenga esos elementos. Utilicé una clase privada anidada dentro de mi clase de caché, algo así:
private static class CacheEntry
{
private String uri; // Key
private String fetched_xml; // The XML document (main value)
private long put_time;
private long expires_time;
private long size;
private long hits;
private long last_used_time;
}
El ConcurrentHashMap se introdujo en el URI y se veía así:
private final Map<String, CacheEntry> cache;
[...]
cache = new ConcurrentHashMap<String, CacheEntry>(100, 0.75f, 3);
Este código agrega un nuevo documento XML al caché:
CacheEntry value = new CacheEntry();
value.fetched_xml(fetched_xml);
value.uri = uri;
value.put_time = System.currentTimeMillis();
value.expires_time = representation.getExpirationDate().getTime();
value.size = bytes_fetched;
value.hits = 0;
value.last_used_time = 0;
cache.put(uri, value);
Editar: Si necesita asignar una clave a una Lista de n objetos en Java, puede colocar esos objetos en java.util.collections.ArrayList y use ArrayList como el valor del Mapa. ??