在Java中对哈希映射进行双重迭代

在Java中对哈希映射进行双重迭代,java,Java,我使用以下方法连接apriori连接步骤中生成的集合 Iterator<Entry<List<Integer>, Integer>> i1 = hm.entrySet().iterator() ; Iterator<Entry<List<Integer>, Integer>> i2 = hm.entrySet().iterator() ; while(i1.hasNext()) { while(i2.hasNext

我使用以下方法连接apriori连接步骤中生成的集合

Iterator<Entry<List<Integer>, Integer>> i1 = hm.entrySet().iterator() ;
Iterator<Entry<List<Integer>, Integer>> i2 = hm.entrySet().iterator() ;

while(i1.hasNext()) {
    while(i2.hasNext()) {

        Entry<List<Integer>, Integer> pair1 = i1.next() ; 
        Entry<List<Integer>, Integer> pair2 = i2.next() ; 

        // Do some joining part here

        System.out.println(pair1.getKey());
        System.out.println(pair2.getKey());

        } 
    }
}

实际上,我认为它将遍历哈希映射的所有n*n值。但实际情况是,两个迭代器并行执行,并且只执行n次,就好像两个迭代器相同一样。请提出克服这个问题的方法

您必须在外循环中创建第二个迭代器,以便它在每次迭代内循环之前重新开始迭代条目

Iterator<Entry<List<Integer>, Integer>> i1 = hm.entrySet().iterator() ; 
while(i1.hasNext()) {
    Entry<List<Integer>, Integer> pair1 = i1.next() ; 
    Iterator<Entry<List<Integer>, Integer>> i2 = hm.entrySet().iterator() ;
    while(i2.hasNext()) {
        Entry<List<Integer>, Integer> pair2 = i2.next() ; 
        // Do some joining part here

        System.out.println(pair1.getKey());
        System.out.println(pair2.getKey());
        } 
    }
}
另一个必需的更改是获取内部循环外部的第一个迭代器的当前条目

Iterator<Entry<List<Integer>, Integer>> i1 = hm.entrySet().iterator() ; 
while(i1.hasNext()) {
    Entry<List<Integer>, Integer> pair1 = i1.next() ; 
    Iterator<Entry<List<Integer>, Integer>> i2 = hm.entrySet().iterator() ;
    while(i2.hasNext()) {
        Entry<List<Integer>, Integer> pair2 = i2.next() ; 
        // Do some joining part here

        System.out.println(pair1.getKey());
        System.out.println(pair2.getKey());
        } 
    }
}

您必须在外循环中创建第二个迭代器,以便它在每次迭代内循环之前重新迭代条目

Iterator<Entry<List<Integer>, Integer>> i1 = hm.entrySet().iterator() ; 
while(i1.hasNext()) {
    Entry<List<Integer>, Integer> pair1 = i1.next() ; 
    Iterator<Entry<List<Integer>, Integer>> i2 = hm.entrySet().iterator() ;
    while(i2.hasNext()) {
        Entry<List<Integer>, Integer> pair2 = i2.next() ; 
        // Do some joining part here

        System.out.println(pair1.getKey());
        System.out.println(pair2.getKey());
        } 
    }
}
另一个必需的更改是获取内部循环外部的第一个迭代器的当前条目

Iterator<Entry<List<Integer>, Integer>> i1 = hm.entrySet().iterator() ; 
while(i1.hasNext()) {
    Entry<List<Integer>, Integer> pair1 = i1.next() ; 
    Iterator<Entry<List<Integer>, Integer>> i2 = hm.entrySet().iterator() ;
    while(i2.hasNext()) {
        Entry<List<Integer>, Integer> pair2 = i2.next() ; 
        // Do some joining part here

        System.out.println(pair1.getKey());
        System.out.println(pair2.getKey());
        } 
    }
}
这里没有看到显式迭代器使用的太多价值,而且我认为简单地为每个循环使用(也称为增强的for循环)会更加清晰,所以我稍微改变了OP的方法


这里没有看到显式迭代器使用的太多价值,而且我认为简单地为每个循环使用(也称为增强的for循环)会更加清晰,所以我稍微改变了OP的方法

你可以去掉显式迭代器,在entrySet上使用for循环。你可以去掉显式迭代器,在entrySet上使用for循环。啊啊,不知道我为什么会犯这样明显的错误。谢谢你指出啊,不知道我为什么会犯这样明显的错误。谢谢你指出