【问题标题】:How to iterate over MultiKeyMap?如何迭代MultiKeyMap?
【发布时间】:2016-05-24 04:44:00
【问题描述】:

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

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

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

【问题讨论】:

  • mapIterator() 有什么问题?
  • 那么,你有 hashmap 的 hashmap 吗?我很好奇你是否在做这个多键设计你没有做类似的事情:multiKey.get("key1:key2");这样字符串key实际上是key1和key2连接在一起。
  • @Marvin 解决了你的第一个问题,第二个问题的答案是你不能进行部分匹配,因为它不受 API 支持:commons.apache.org/proper/commons-collections/apidocs/org/…
  • @Fallenreaper 我有一个由 appache 公共库提供的 MultiKeyMap。
  • 哦,明白了。是的,我以前从未真正使用过那个。我希望我能有所帮助。 :-/

标签: java dictionary apache-commons-collection multikey


【解决方案1】:

MultiKeyMap 的 key-value 迭代类似于 hash map:

    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;
    }

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-06
        • 2016-04-09
        • 1970-01-01
        • 2021-06-22
        • 2011-12-29
        相关资源
        最近更新 更多