문제
최근 직장에서 아래 코드와 유사한 일부 코드(내가 다루고 있는 것과 유사하게 다시 생성됨)를 발견했습니다.
성능을 염두에 두고 하나의 데이터 구조를 사용하도록 아래 코드를 재작업할 수 있는 방법이 있습니까?
다음은 내가 의미하는 바를 설명하는 몇 가지 코드입니다.
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);
}
}
해결책
이것은 대답합니다 여기 Bimap을 사용하는 것이 좋습니다 Google 컬렉션
다른 팁
아파치 컬렉션은 지원합니다 Bidimap 인터페이스 및 다양한 상당히 효과적인 구현.
당신은 싱글을 사용할 수 있습니다 Map<Object,Object>
두 매핑을 모두 수행합니다. 못생긴. 성능은 거의 동일해야하거나, 당신이 많은 사람들이있을 가능성이 거의없는 이벤트에서 ObjectMapper
맵핑 된 값이 거의 없습니다.
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 컬렉션의 커미터입니다.
제휴하지 않습니다 StackOverflow