在HashMap Java上迭代两次

rpn*_*281 1 java iterator hashmap listiterator

我有一个HashMap声明为

static HashMap<String,ArrayList<Integer>> inverted_index = new HashMap<String,ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)

我重复了它的键

    public static void printInvertedIndex() throws FileNotFoundException{
    PrintWriter writer = new PrintWriter(new File("InvertedIndex.txt"));
    Iterator it = inverted_index.entrySet().iterator();

    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        writer.println(pair.getKey() + "  " + pair.getValue());
        it.remove();
        }

    writer.close();
}
Run Code Online (Sandbox Code Playgroud)

我在一个名为printInvertedIndex()的函数中完成了所有这些操作.现在在其他一些函数中我想再次迭代HashMap,所以我做了这个

    public static void createPermutermIndex(){
    permuterm_index.clear();

    Iterator it = inverted_index.entrySet().iterator();

    while (it.hasNext()) {
        System.out.println("here");
        Map.Entry pair = (Map.Entry)it.next();
        String temp;
        temp = pair.getKey() + "$";
        ArrayList<String> perms = rotations(temp);
        System.out.println(perms.size());
        for(int i=0; i<perms.size(); i++)
            System.out.println(perms.get(i));
            //permuterm_index.put(temp, perms.get(i));
        it.remove();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是在调用createPermutermIndex()时我没有打印"here".也就是说,我的迭代器不会迭代invert_index的条目.

有什么方法可以再次迭代它吗?

Mat*_*ens 7

while (it.hasNext()) {
    Map.Entry pair = (Map.Entry)it.next();
    writer.println(pair.getKey() + "  " + pair.getValue());
    it.remove(); // <- This is your problem
}
Run Code Online (Sandbox Code Playgroud)

您正在迭代它们时删除条目.循环退出时,您将删除地图中的所有条目.因此,第二个循环不做任何事情就不足为奇了 - 没有什么可以迭代的.

在这些循环期间,您似乎不想删除任何内容,因此只需it.remove()在两个循环中删除这些行.