要處理一個文檔集合,需要統計出corpus包含的所有單詞,即統計出一個詞彙表,詞彙表中需要儲存單詞和相應的索引。當然,統計之前需要對文檔進行stopword removal和text stemming。得到詞彙表後,很自然地,我們有兩種需求,一是根據單詞得到它的索引,另外一個就是根據索引得到相應的單詞。但是jdk中的map類只支援根據key來擷取value,如果要根據value擷取key就需要使用entryset方法得到所有的entry,再遍曆一遍,判斷每個entry的value是否就是我們期望的,如果是,就記下這個entry相應的key,具體參考這裡。
當然,那是比較ugly的做法。我們可以使用Apache Commons Collections中的BidiMap介面來完成這個任務,使用這個介面的限制之一就是key和value必須是一一對應(one to one)的。下面是一個簡單的樣本:
BidiMap bidi = new HashBidiMap();bidi.put("SIX", "6");bidi.get("SIX"); // returns "6"bidi.getKey("6"); // returns "SIX"bidi.removeValue("6"); // removes the mappingBidiMap inverse = bidi.inverseBidiMap(); // returns a map with keys and values swapped
在google上還可以搜到幾個例子:http://java.dzone.com/articles/guavas-bidirectional-maps,
Apache Commons Collections中的介面不支援泛型(generics),不過還有另外一個選擇guava-libraries,這是來自google的類庫。裡面的BiMap可以完成同樣的任務,簡單的樣本如下:
BiMap<Integer, String> biMap = HashBiMap.create();biMap.put(1, "a");biMap.put(2, "b");biMap.put(3, "c");BiMap<String, Integer> invertedMap = biMap.inverse();
先寫這麼多吧,樣本不完整,不過應該很簡單的。
參考:http://stackoverflow.com/questions/1383797/java-hashmap-how-to-get-key-from-value