从循环中的Map中删除值

时间:2018-01-11 10:28:25

标签: java hashmap

我正在尝试比较两个地图并从一个地图中删除第二个地图中包含的值。这是代码:

    HashMap<String, String> firstMap = new HashMap<>();
    HashMap<String, String> secondMap = new HashMap<>();

    firstMap.put("keyOne", "valueOne");
    firstMap.put("keyTwo", "valueTwo");
    firstMap.put("THIS KEY WILL BE REMOVED", "valueThree");

    System.out.println("\nMAP ONE\n" + firstMap +  "\n");

    secondMap.put("keyOne", "valueOne");
    secondMap.put("keyTwo", "valueTwo");

    System.out.println("\nMAP TWO\n" + secondMap +  "\n");

    Iterator<String> firstMapIterator = firstMap.keySet().iterator();

    if(!firstMap.equals(secondMap)){

            firstMapIterator.next();

            for(String key : firstMap.keySet()){

                if(firstMap.containsKey(key) && !secondMap.containsKey(key)){
                    firstMapIterator.remove();
                    break;
                }
            }
    }
    System.out.println("\nMAP ONE MATCHING MAP TWO?\n" + firstMap +  "\n");

现在,代码会从地图中删除一个元素,但不会删除我期望的元素。正如您在firstMap中的代码中所看到的,我输入的第三个键是我希望删除的键。但是,这是我似乎得到的firstMap的最终内容。

{keyOne=valueOne, THIS KEY WILL BE REMOVED=valueThree}

有什么想法吗?感谢

编辑:此代码的目标是:   - 比较两张地图   - 通过每个键增加   - 如果在第二个地图中找不到第一个地图,则从第一个地图中删除键

5 个答案:

答案 0 :(得分:3)

您只需一行即可完成此操作:

    HashMap<String, String> firstMap = new HashMap<>();
    HashMap<String, String> secondMap = new HashMap<>();

    firstMap.put("keyOne", "valueOne");
    firstMap.put("keyTwo", "valueTwo");
    firstMap.put("THIS KEY WILL BE REMOVED", "valueThree");

    System.out.println("\nMAP ONE\n" + firstMap + "\n");

    secondMap.put("keyOne", "valueOne");
    secondMap.put("keyTwo", "valueTwo");

    System.out.println("\nMAP TWO\n" + secondMap + "\n");

    // Remove everything from firstMap that is in secondMap.
    firstMap.keySet().removeAll(secondMap.keySet());

    System.out.println("\nMAP ONE MATCHING MAP TWO?\n" + firstMap + "\n");

请参阅JavaDoc以了解Map.keySet()

  

返回此地图中包含的键的Set视图。该集由地图支持,因此对地图的更改将反映在集合中,反之亦然。 ...该集支持元素删除,它通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从地图中删除相应的映射....

答案 1 :(得分:2)

您无需迭代地图。

你可以简单地做

firstMap.keySet().removeAll(secondMap.keySet());

这将删除第一张地图中第二张地图中出现的所有按键。

此外,您可以使用以下方法删除第一张地图中第二张地图中的所有键:

firstMap.keySet().retainAll(secondMap.keySet());

答案 2 :(得分:1)

您没有正确使用迭代器。您只需将迭代器推进一次(firstMapIterator.next()),因此迭代器获取的第一个键将是从Map中删除的键,而不管key循环中的当前for(String key : firstMap.keySet())。 / p>

您不需要for循环:

Iterator<String> firstMapIterator = firstMap.keySet().iterator();
while (firstMapIterator.hasNext()) {
    if(!secondMap.containsKey(firstMapIterator.next())) {
        firstMapIterator.remove();
        break;
    }
}

答案 3 :(得分:1)

正如其他人已经说过的那样,你可以用一行来做到这一点:

firstMap.keySet().removeAll(secondMap.keySet());

另一种方法是使用Collection.removeIf方法:

firstMap.keySet().removeIf(k -> secondMap.containsKey(k));

以上内容可以改写如下:

firstMap.keySet().removeIf(secondMap::containsKey);

答案 4 :(得分:0)

检查您的firstMapIterator.next();添加到for循环

 HashMap<String, String> firstMap = new HashMap<String, String>();
                HashMap<String, String> secondMap = new HashMap<String, String>();

                firstMap.put("keyOne", "valueOne");
                firstMap.put("keyTwo", "valueTwo");
                firstMap.put("THIS KEY WILL BE REMOVED", "valueThree");

                System.out.println("\nMAP ONE\n" + firstMap +  "\n");

                secondMap.put("keyOne", "valueOne");
                secondMap.put("keyTwo", "valueTwo");

                System.out.println("\nMAP TWO\n" + secondMap +  "\n");

                Iterator<String> firstMapIterator = firstMap.keySet().iterator();

                if(!firstMap.equals(secondMap)){



                    for(String key : firstMap.keySet()){
                        firstMapIterator.next();//add here in for loop
                        if(firstMap.containsKey(key) && !secondMap.containsKey(key)){
                            firstMapIterator.remove();
                            break;
                        }
                    }
                }
                System.out.println("\nMAP ONE MATCHING MAP TWO?\n" + firstMap +  "\n");