BiMap은 키와 값의 양방향 관련 데이터 구조를 제공하는 새로운 컬렉션 유형을 제공합니다.
일반적으로 Java Map을 사용할 때 키를 통해 값을 검색하는 경우가 많지만, 다음과 같은 상황이 발생하면 추가 코드를 작성해야 합니다. 먼저, 식별번호와 파일명을 나타내는 다음의 맵 구조를 살펴보자.
[code] @Test public void logMapTest(){ Map<Integer,String> logfileMap = Maps.newHashMap(); logfileMap.put(1,"a.log"); logfileMap.put(2,"b.log"); logfileMap.put(3,"c.log"); System.out.println("logfileMap:"+logfileMap); }
일련번호로 파일명을 찾는 방법은 매우 간단합니다. 하지만 파일명을 통해 일련번호를 찾으려면 지도를 순회해야 합니다. 물론 역 매핑 관계를 실현하는 데 도움이 되는 Map inversion 메서드를 작성할 수도 있습니다.
[code] /** * 逆转Map的key和value * @param <S> * @param <T> * @param map * @return */ public static <S,T> Map<T,S> getInverseMap(Map<S,T> map) { Map<T,S> inverseMap = new HashMap<T,S>(); for(Entry<S,T> entry: map.entrySet()) { inverseMap.put(entry.getValue(), entry.getKey()); } return inverseMap; }
[code] @Test public void logMapTest(){ Map<Integer,String> logfileMap = Maps.newHashMap(); logfileMap.put(1,"a.log"); logfileMap.put(2,"b.log"); logfileMap.put(3,"c.log"); System.out.println("logfileMap:"+logfileMap); Map<String,Integer> logfileInverseMap = Maps.newHashMap(); logfileInverseMap=getInverseMap(logfileMap); System.out.println("logfileInverseMap:"+logfileInverseMap); }
위 코드는 지도 반전 요구 사항을 실현하는 데 도움이 될 수 있지만 여전히 고려해야 할 몇 가지 문제가 있습니다:
1. 중복 값을 처리하는 방법. 고려하지 않으면 반전 중에 덮어쓰기가 발생합니다.
2. 반전된 맵에 새 키를 추가하면 반전 전 맵에서 값을 업데이트해야 합니까?
이 경우 비즈니스 외에 고려해야 할 사항이 늘어나고 작성된 코드의 가독성도 떨어지게 됩니다. 현재 Guava에서 BiMap 사용을 고려할 수 있습니다.
Bimap
Bimap은 사용이 매우 간단합니다. 위의 사용 시나리오에서는 매우 간단한 코드를 사용하여 이를 달성할 수 있습니다.
[code] @Test public void BimapTest(){ BiMap<Integer,String> logfileMap = HashBiMap.create(); logfileMap.put(1,"a.log"); logfileMap.put(2,"b.log"); logfileMap.put(3,"c.log"); System.out.println("logfileMap:"+logfileMap); BiMap<String,Integer> filelogMap = logfileMap.inverse(); System.out.println("filelogMap:"+filelogMap); }
[code] @Test public void BimapTest(){ BiMap<Integer,String> logfileMap = HashBiMap.create(); logfileMap.put(1,"a.log"); logfileMap.put(2,"b.log"); logfileMap.put(3,"c.log"); logfileMap.put(4,"d.log"); logfileMap.put(5,"d.log"); }
logfileMap.put(5, "d.log")는 java.lang.IllegalArgumentException: 값이 이미 발생합니다. 현재: d.log 오류. 반복되는 값 값을 삽입해야 하는 경우 forcePut 메소드를 선택할 수 있습니다. 하지만 우리가 주목해야 할 점은 이전 키도 덮어쓰여진다는 것입니다.
[code] @Test public void BimapTest(){ BiMap<Integer,String> logfileMap = HashBiMap.create(); logfileMap.put(1,"a.log"); logfileMap.put(2,"b.log"); logfileMap.put(3,"c.log"); logfileMap.put(4,"d.log"); logfileMap.forcePut(5,"d.log"); System.out.println("logfileMap:"+logfileMap); } 输出: logfileMap:{5=d.log, 3=c.log, 2=b.log, 1=a.log}
역 메소드 이해하기
역 메소드는 반전된 BiMap을 반환하지만 이 반전된 지도는 새로운 지도 객체가 아니며 뷰 연관을 구현하므로 모든 반전된 지도에 대한 작업은 원래 지도 객체에 영향을 미칩니다. 예:
[code] @Test public void BimapTest(){ BiMap<Integer,String> logfileMap = HashBiMap.create(); logfileMap.put(1,"a.log"); logfileMap.put(2,"b.log"); logfileMap.put(3,"c.log"); System.out.println("logfileMap:"+logfileMap); BiMap<String,Integer> filelogMap = logfileMap.inverse(); System.out.println("filelogMap:"+filelogMap); logfileMap.put(4,"d.log"); System.out.println("logfileMap:"+logfileMap); System.out.println("filelogMap:"+filelogMap); }
BiMap의 구현 클래스
키-값 맵 Impl 값-키 맵 Impl 해당 BiMap
HashMap HashBiMap
ImmutableMap ImmutableMapableBiMap
EnumMap EnumMap EnumBiMap
EnumMap HashMap EnumHashBiMap
위는 Java-Class Library-Guava-Bimap의 내용입니다. 자세한 내용은 PHP 중국어를 참고해주세요. 홈페이지(www.php.cn)!