在Java中双重迭代哈希映射

时间:2015-11-16 07:57:45

标签: java

我使用以下方式加入apriori join步骤中生成的集合

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次,就好像两个迭代器都是相同的一样。请提出一种克服此问题的方法。

2 个答案:

答案 0 :(得分:3)

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

另一个必要的更改是获取内部循环外第一个迭代器的当前条目。

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

答案 1 :(得分:3)

Map<List<Integer>, Integer> hm.....;

for (Map.Entry<List<Integer>,Integer> pair1 : hm.entrySet()) {
    for (Map.Entry<List<Integer>,Integer> pair2 : hm.entrySet()) {
        // do anything you want with pair1 and pair2,
        // just don't make structural change to hm
    }
}

在这里没有看到显式迭代器使用的很多价值,我认为简单地使用for-each循环(又称为循环增强)是非常清楚的,所以我稍微改变了OP的方法。