繁体   English   中英

而对于迭代器hashmap

[英]while for iterator hashmap

我试图迭代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),....
  • loop3:(c,d),(c,e),.....
    ...

在清洁逻辑方面,我更喜欢不使用两个迭代器,而只是使用基于索引的解决方案。 您可以简单地将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 ,你将能够很容易地做同样的逻辑。

您要做的是在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)

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM