代码之家  ›  专栏  ›  技术社区  ›  user1690298

而对于迭代器hashmap

  •  3
  • user1690298  · 技术社区  · 7 年前

    我尝试迭代HashMap MyMap中的项目,以获得2个键(节点)的所有可能组合对:

    我使用了以下代码:

    Iterator Iterator1= MyMap.entrySet().iterator();
    
    while (Iterator1.hasNext() ) {
        Map.Entry X = (Map.Entry) Iterator1.next();
        NodeX=(String) X.getKey();                       
        Iterator Iterator2= MyMap.entrySet().iterator();
    
        while (Iterator2.hasNext() ) {
            Map.Entry Y = (Map.Entry) Iterator2.next();
            NodeY= (String) Y.getKey();                                        
            System.out.println("{ "+NodeX+" , "+NodeY+" }");
        }
    
    }
    

    每次编译器成功执行第一个“while循环”,它都会使用hashmap的第一个键重新启动。在第二个“while循环”中,我想从当前选择的NodeX的以下元素启动NodeY。

    这是我想要的输出:

    • 回路1:(a,b),(a,c),(a,d),(a,e),。。。。
    • 回路2:(b,c),(b,d),(b,e),。。。。
    • 回路3:(c,d),(c,e),。。。。。
      。。。
    2 回复  |  直到 7 年前
        1
  •  2
  •   AxelH    7 年前

    在干净的逻辑方面,我不喜欢使用两个迭代器,而只是使用基于索引的解决方案。您只需转换 Set 可以根据索引获取每个项目。(可能更容易解决,但我确实

        Map<String, String> map = new HashMap<>();
        map.put("a", "");
        map.put("b", "");
        map.put("c", "");
        map.put("d", "");
        map.put("e", "");
        map.put("f", "");
    
        List<String> list = new ArrayList<String>(map.keySet());
    
        for (int i = 0; i < list.size() - 1; ++i) {
            String s = list.get(i);
            for (int j = i + 1; j < list.size(); ++j) {
                System.out.format("(%s, %s)%n", s, list.get(j));
            }
        }
    

    外部循环迭代每个项(但最后一项除外),内部循环将直接从下一项迭代到最后一项。

    a b
    a c
    a d
    a e
    a f
    b c
    b d
    b e
    b f
    c d
    c e
    c f
    d e
    d f
    e f
    

    这并不是真的更有效,因为您仍然需要创建一个数组才能做到这一点,但如果您不需要映射,但可以直接使用 List ,您将能够很容易地执行相同的逻辑。

        2
  •  1
  •   Tim Biegeleisen    7 年前

    您要做的是在Java中对hashmap的键集进行双重迭代。下面是一个示例脚本,演示了如何实现这一点。秘诀是只打印密钥对,这样第一个密钥就严格小于第二个密钥。这可以防止打印副本的机会,尽管该算法非常强大 O(n^2) 对整个关键帧集进行双重迭代。

    Map<Character, Integer> map = new HashMap<>();
    map.put('a', 1);
    map.put('b', 2);
    map.put('c', 3);
    map.put('d', 4);
    
    Iterator<Character> i1 = map.keySet().iterator();
    
    while (i1.hasNext()) {
        char k1 = i1.next();
        Iterator<Character> i2 = map.keySet().iterator();
    
        while (i2.hasNext()) {
            char k2 = i2.next();
            if (k1 < k2) {
                System.out.println("(" + k1 + ", " + k2 + ")");
            }
        }
    }
    
    (a, b)
    (a, c)
    (a, d)
    (b, c)
    (b, d)
    (c, d)
    

    Demo