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);
    }


}
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top