多键映射和部分查询

6

我正在寻找一种具有多个键的地图实现。我知道 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");

返回null,但在这种情况下我想要得到“1”和“2”。我自己的实现不是一个选项。我想使用我可以信任的东西。


1
不要用MultiKeyMap,我认为你想要的是MultiMap。你可以在这里找到它:http://commons.apache.org/collections/apidocs/index.html?org/apache/commons/collections/map/MultiKeyMap.html - nhahtdh
你看过guice了吗?我在你的例子中有一个小问题 - 上述的guice-Multimap只有在一次使用一个键时才能正常工作,而不是像你的例子中mkm.put("key1", "key2", "key3", "1");。否则,我认为MultiMap会很好用 - 并且在同一个包中,你可以得到一堆其他的Maps - 如果你在那里找不到它,你就找不到它了 ;) - michael_s
3个回答

3
我认为Guava有一个表格实现,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");

1
如果您能将需求反转并为每个键多次提供值,则使用 Guava的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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接