5

我正在使用来自提供多键值对的 commons-collections 的 MultiKeyMap。我有 3 个键,它们是字符串。我有两个问题,我不知道如何解决。

如何遍历所有多键值对?有了一个简单的 HashMap 我就知道了。

其次,如何在前两个键固定的情况下获得所有多键值对?这意味着我想得到这样multiKey.get("key1","key2",?);的东西,其中没有指定第三个键。

4

3 回答 3

6

MultiKeyMap 的键值迭代类似于哈希映射:

    MultiKeyMap<String, String> multiKeyMap = new MultiKeyMap();

    multiKeyMap.put( "a1", "b1", "c1", "value1");
    multiKeyMap.put( "a2", "b2", "c2", "value1");

    for(Map.Entry<MultiKey<? extends String>, String> entry: multiKeyMap.entrySet()){
        System.out.println(entry.getKey().getKey(0)
                +" "+entry.getKey().getKey(1)
                +" "+entry.getKey().getKey(2)
                + " value: "+entry.getValue());
    }

对于您的第二个请求,您可以根据之前的迭代编写自己的方法。

public static Set<Map.Entry<MultiKey<? extends String>, String>> match2Keys(String first, String second,
                                                                                MultiKeyMap<String, String> multiKeyMap) {
        Set<Map.Entry<MultiKey<? extends String>, String>> set = new HashSet<>();
        for (Map.Entry<MultiKey<? extends String>, String> entry : multiKeyMap.entrySet()) {
            if (first.equals(entry.getKey().getKey(0)) 
                && second.equals(entry.getKey().getKey(1))) {
                set.add(entry);
            }
        }
        return set;
    }
于 2016-02-12T22:12:04.163 回答
3

我正在使用commons-collections 4.4提供forEach方法的版本。它可以如下使用。

MultiKeyMap<String,Integer> multiKeyMap=new MultiKeyMap<>();
        multiKeyMap.put("class 9","Div A",30);
        multiKeyMap.put("class 9","Div B",40);
        multiKeyMap.forEach((key,value)->{
            System.out.println(key.getKey(0)+" & "+key.getKey(1)+" -> "+value);
        });

Output:
class 9 & Div A -> 30
class 9 & Div B -> 40
于 2020-04-29T10:03:49.027 回答
2

您可以在 values() 中迭代列表:

    for(Object entry: multiKey.values()){ //TODO }

我刚刚发现这是一个四年前的问题...

于 2020-05-15T10:33:59.307 回答