A due Vie Mappatura utilizzando Dati singola Struttura
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);
}
}
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 ObjectMapper
s 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.