Dos Forma de Asignación de uso de una sola Estructura de Datos
Pregunta
Corrí a través de algún código recientemente en el trabajo (recreado a ser similar a lo que yo estoy tratando) similar al siguiente código
Hay una manera que puedo modificar el código a continuación para utilizar una estructura de datos (con el rendimiento en mente)?
Aquí está el código para ilustrar lo que quiero decir:
public class ObjectMapper {
private Map<UUID,Integer> uuidMap;
private Map<Integer,UUID> indexMap;
public ObjectMapper(){
uuidMap = new HashMap<UUID,Integer>();
indexMap = new HashMap<Integer,UUID>();
}
public void addMapping(int index, UUID uuid){
uuidMap.put(uuid, index);
indexMap.put(index, uuid);
}
.
.
.
public Integer getIndexByUUID(UUID uuid){
return uuidMap.get(uuid);
}
public UUID getUUIDByIndex(Integer index){
return indexMap.get(index);
}
}
Solución
es respondida aquí con la recomendación de utilizar BIMAP de Google Colecciones
Otros consejos
colecciones Apache soporta un BidiMap interfaz y una variedad de implementaciones bastante eficaces.
Se puede usar un único Map<Object,Object>
hacer las dos asignaciones. Feo, seguro. Rendimiento debe ser aproximadamente la misma o ligeramente mejor en el improbable caso de que usted tiene muchas ObjectMapper
s con unos valores asignados.
Puede utilizar BIMAP de Eclipse Colecciones .
BiMap
es un mapa que permite a los usuarios realizar búsquedas de ambas direcciones. Tanto las claves y los valores en una BIMAP son únicos.
La aplicación principal es HashBiMap
.
inverse()
BiMap.inverse()
devuelve una vista donde se intercambian la posición del tipo de clave y tipo de valor.
MutableBiMap<Integer, String> biMap =
HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3");
MutableBiMap<String, Integer> inverse = biMap.inverse();
Assert.assertEquals("1", biMap.get(1));
Assert.assertEquals(1, inverse.get("1"));
Assert.assertTrue(inverse.containsKey("3"));
Assert.assertEquals(2, inverse.put("2", 4));
put()
MutableBiMap.put()
se comporta como Map.put()
en un mapa normal, excepto que lanza cuando se añade un valor duplicado.
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.put(1, "1"); // behaves like a regular put()
biMap.put(1, "1"); // no effect
biMap.put(2, "1"); // throws IllegalArgumentException
forcePut()
Esto comporta como <=>, pero en silencio elimina la entrada del mapa con el mismo valor antes de poner el par clave-valor en el mapa.
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.forcePut(1, "1"); // behaves like a regular put()
biMap.forcePut(1, "1"); // no effect
biMap.forcePut(1, "2"); // replaces the [1,"1"] pair with [1, "2"]
biMap.put(2, "2"); // removes the [1, "2"] pair before putting
Assert.assertFalse(biMap.containsKey(1));
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "1"), biMap);
Nota:. Soy un confirmador de colecciones Eclipse