2013-02-10 55 views
3

我用多鍵搜索映射實現。我知道Apache Commons,但它並不滿足我。多鍵映射和部分查詢

我希望能夠傳遞一個密鑰並獲取包含傳遞密鑰的所有條目,例如,

MultiKeyMap mkm = new MultiKeyMap(); 
mkm.put("key1", "key2", "key3", "1"); 
mkm.put("key1", "key22", "key33", "2"); 
mkm.put("key12", "key22", "key32", "3"); 

mkm.get("key1"); 

返回空但在這種情況下,我希望得到「1」和「2」 我自己的實現是不是一種選擇。我想用一些我可以信賴的東西。

+1

而不是MultiKeyMap,我想你想要[MultiMap](http://commons.apache.org/collections/apidocs/index.html?org/apache/commons/collections/map/MultiKeyMap.html) – nhahtdh 2013-02-10 11:39:17

+0

你有沒有看看[guice](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html)?我的例子有一點問題 - 前面提到的guice-Multimap一次只能使用一個鍵時才能正常工作。不像在你的例子中'mkm.put(「key1」,「key2」,「key3」,「1」);'。否則,我認爲MultiMap可以正常工作 - 並且在同一個軟件包中可以獲得大量其他地圖 - 如果在那裏找不到它,則無法在任何地方找到它;) – 2013-02-10 11:43:52

回答

3

我認爲番石榴有一個表執行Table<Key1,Key2,Value>你可以做table.get(key1)table.get(key2)table.get(key1, key2)。我認爲它只支持每個表兩個鍵,但不確定。可能想看看這個。

Guava Table javadoc

1

我認爲你可以HashMap

HashMap<String, ArrayList<String>> map = new HashMap<>(); 
    ArrayList<String> ls=new ArrayList<>(); 
    ArrayList<String> ls2=new ArrayList<>(); 
    ls.add("key3"); 
    ls.add("1"); 
    ls.add("key2"); 
    ls.add("key22"); 
    ls.add("key33"); 
    ls.add("2"); 

    ls2.add("key22"); 
    ls2.add("key32"); 
    ls2.add("3"); 

    map.put("key1",ls); 
    map.put("key12", ls2); 

    map.get("key1"); 
0

做到這一點。如果你可以爲每個按鍵轉身的要求,把值多次,一次,然後Guava's MultiMap是非常好的使用:

Multimap<String, String> map = HashMultimap.create(); 
    map.put("key1", "1"); 
    map.put("key2", "1"); 
    map.put("key3", "1"); 

    map.put("key1", "2"); 
    map.put("key22", "2"); 
    map.put("key33", "2"); 

    map.put("key12", "3"); 
    map.put("key22", "3"); 
    map.put("key32", "3"); 

    Collection<String> values = map.get("key1"); 
    System.out.println(values); 

打印

[2, 1]