java - while 对于迭代器 hashmap

标签 java loops 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

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

关于java - while 对于迭代器 hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49644437/

相关文章:

java - 制作没有标签的折线图

java - 使用java程序将文件从一个位置复制到Linux中的另一个位置

java - 我的 if-else 语句有一个问题,我的变量没有被初始化

loops - 如何在一个从索引i和i + 1取值的数组上创建迭代器?

javascript - 以编程方式从对象添加方法

java - Atmosphere @MeteorService 注释不起作用

java - 循环中的 Switch 语句重复次数未知

java - 重载HashMap中的Equals方法和putVal方法

java - 在 Java 中迭代 Map 时跳过索引

Java 8 HashMap 内部结构