>  기사  >  Java  >  Java 클래스 라이브러리-Guava-Bimap

Java 클래스 라이브러리-Guava-Bimap

黄舟
黄舟원래의
2017-01-19 13:18:421518검색

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);
    }
Bimap 데이터의 필수 고유성

BiMap을 사용하는 경우 Value의 고유성이 필요합니다. 값이 반복되면 오류가 발생합니다. java.lang.IllegalArgumentException, 예를 들어
[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)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.