1. 程式人生 > >guava學習:guava集合型別-Bimap

guava學習:guava集合型別-Bimap

學習guava讓我驚喜的第二個介面就是:Bimap

BiMap是一種特殊的對映其保持對映,同時確保沒有重複的值是存在於該對映和一個值可以安全地用於獲取鍵背面的倒數對映。

最近開發過程中,經常會有這種根據key找value或者根據value找key 的功能,之前都是將值儲存到列舉或者map中,然後通過反轉的寫法來實現的,直到發現了Bimap,才發現原來還有這麼簡便的方式。

介面申明

@GwtCompatible
public interface BiMap<K,V>
extends Map<K,V>

介面方法

 

S.N. 方法及說明
1 V forcePut(K key, V value)
另一種put的形式是默默刪除,在put(K, V)執行前的任何現有條目值值。
2 BiMap<V,K> inverse()
返回此bimap,每一個bimap的值對映到其相關聯的鍵的逆檢視。
3 V put(K key, V value)
關聯指定值與此對映中(可選操作)指定的鍵。
4 void putAll(Map<? extends K,? extends V> map)

將所有從指定對映此對映(可選操作)的對映。
5 Set<V> values()
返回此對映中包含Collection的值檢視。

 

使用樣例

BiMap<Integer, String> empIDNameMap = HashBiMap.create();

        empIDNameMap.put(new Integer(101), "Mahesh");
        empIDNameMap.put(new Integer(102), "Sohan");
        empIDNameMap.put(
new Integer(103), "Ramesh"); //得到101對應的value System.out.println(empIDNameMap.get(101)); //得到Mahesh對應key System.out.println(empIDNameMap.inverse().get("Mahesh")); //傳統map的寫法 System.out.println(getInverseMap(empIDNameMap).get("Mahesh"));
/**
     * map反轉工具類
     * @param map
     * @param <S>
     * @param <T>
     * @return
     */
    private static <S,T> Map<T,S> getInverseMap(Map<S,T> map) {
        Map<T,S> inverseMap = new HashMap<T,S>();
        for(Map.Entry<S,T> entry: map.entrySet()) {
            inverseMap.put(entry.getValue(), entry.getKey());
        }
        return inverseMap;
    }

執行結果

Mahesh
101
101

 

inverse方法會返回一個反轉的BiMap,但是注意這個反轉的map不是新的map物件,它實現了一種檢視關聯,這樣你對於反轉後的map的所有操作都會影響原先的map物件。

讓我們繼續看下面的例子

System.out.println(empIDNameMap);
BiMap<String,Integer> inverseMap = empIDNameMap.inverse();
System.out.println(inverseMap);
empIDNameMap.put(new Integer(104),"Jhone");
System.out.println(empIDNameMap);
System.out.println(inverseMap);

inverseMap.put("Mahesh1",105);
System.out.println(empIDNameMap);
System.out.println(inverseMap);

執行結果

{101=Mahesh, 102=Sohan, 103=Ramesh}
{Mahesh=101, Sohan=102, Ramesh=103}
{101=Mahesh, 102=Sohan, 103=Ramesh, 104=Jhone}
{Mahesh=101, Sohan=102, Ramesh=103, Jhone=104}
{101=Mahesh, 102=Sohan, 103=Ramesh, 104=Jhone, 105=Mahesh1}
{Mahesh=101, Sohan=102, Ramesh=103, Jhone=104, Mahesh1=105}

可以看到,無論是操作empIdNameMap 還是操作inverseMap,2個map的資料都是相關聯的發生變化。