ホームページ  >  記事  >  Java  >  Java クラス ライブラリ - Guava-Bimap

Java クラス ライブラリ - Guava-Bimap

黄舟
黄舟オリジナル
2017-01-19 13:18:421462ブラウズ

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 反転メソッドを作成することもできます。

[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

上記の使用シナリオでは、非常に簡単なコードで実装できます:

[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 を使用する場合、値は必須の一意性になります。値が繰り返されると、エラーがスローされます: 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: value selected: d をスローします。ログの間違い。本当に繰り返し値を挿入する必要がある場合は、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}

inverse メソッドを理解する

inverse メソッドは反転した 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実装クラス

Key-Value Map Impl Value-Key Map Impl 対応するBiMap

HashMap HashMap HashBiMap

ImmutableMap ImmutableMap

EnumMap EnumMap EnumBi Map

EnumMap HashMap EnumHashBiMap

上記は Java- class Library-Guava-Bimap コンテンツ。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。