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); }
[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 サイト (m.sbmmt.com) に注目してください。