Domanda

Mi sono imbattuto in un po ' di codice di recente al lavoro (ricreato per essere simile a quello che ho a che fare con) simile al codice riportato di seguito

C'è un modo posso modificare il codice riportato di seguito per utilizzare una struttura dati (con prestazioni in mente)?

Qui è un po ' di codice per illustrare ciò che intendo:

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


}
È stato utile?

Soluzione

Questo è risposto qui con la raccomandazione di utilizzare BiMap da Google Collezioni

Altri suggerimenti

Apache collezioni supporta un BidiMap interfaccia e una varietà di abbastanza efficace e implementazioni.

Si potrebbe utilizzare un unico Map<Object,Object> per fare entrambe le associazioni.Brutto, certo.Le prestazioni dovrebbero essere grosso modo la stessa, o leggermente migliore nel caso improbabile che avete molte ObjectMappers con pochi valori mappati.

È possibile utilizzare BiMap da Eclipse Collezioni.

BiMap è una mappa che consente agli utenti di eseguire ricerche da entrambe le direzioni.Le chiavi e i valori in un BiMap sono unici.

La principale attuazione è HashBiMap.

inverse()

BiMap.inverse() restituisce una vista in cui la posizione della chiave tipo e tipo di valore sono scambiati.

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() si comporta come Map.put() su una normale mappa, tranne che si genera quando un duplicato valore aggiunto.

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()

Questo si comporta come MutableBiMap.put(), ma in silenzio rimuove la voce della mappa con lo stesso valore prima di mettere la coppia chiave-valore in mappa.

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: Io sono un committer per Eclipse collezioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top