我最近在工作中遇到了一些代码(重新创建类似于我正在处理的代码),类似于下面的代码
有没有办法可以重新编写下面的代码来使用一个数据结构(考虑到性能)?
以下是一些代码来说明我的意思:
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);
}
}
答案 0 :(得分:5)
这回答here,建议使用Google Collections
中的BiMap答案 1 :(得分:2)
Apache集合支持BidiMap接口和各种相当有效的实现。
答案 2 :(得分:1)
您可以使用单个Map<Object,Object>
来执行这两种映射。丑陋,当然。性能应该大致相同,或者稍微好一点,如果您有很多ObjectMapper
s且映射值很少的话。
答案 3 :(得分:1)
您可以使用BiMap中的Eclipse Collections。
BiMap
是一个允许用户从两个方向执行查找的地图。 BiMap中的键和值都是唯一的。
主要实施是HashBiMap
。
<强> inverse()
强>
BiMap.inverse()
返回一个视图,其中交换了键类型和值类型的位置。
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()
在常规地图上的行为与Map.put()
相似,只是在添加重复值时会抛出。
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()
强>
此行为与MutableBiMap.put()
类似,但在将键值对放入地图之前,它会以静默方式删除具有相同值的映射条目。
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);
注意:我是Eclipse集合的提交者。