java - 如何从两个 map 中删除相同的键

标签 java api dictionary java-8 interface

我在 Java 中创建了两个包含相同类型的键和值的映射:

Map<Position,Movement> A;
Map<Position,Movement> B;

我想从它们中删除(而不是创建新的映射)相同的键。我不在乎值(value)是否不同。例如,如果 A 的位置:a2,移动:n,nB 的位置: >a2,运动:1,2 这些条目应删除。

我想知道是否有一种快速的方法可以做到这一点,而无需迭代最短的映射并比较每个键。

谢谢

最佳答案

您可以在其中一个映射的 keySet() 上使用 Iterator,并从迭代器和另一个映射中删除该元素(如果该键存在于该映射中)其他 map 。

Iterator<String> itr = map1.keySet().iterator();
String key;
while (itr.hasNext()) {
    key = itr.next();
    if (map2.containsKey(key)) {
        itr.remove();
        map2.remove(key);
    }
}

演示:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, String> map1 = new HashMap<String, String>();
        map1.put("a", "1");
        map1.put("b", "1");
        map1.put("x", "1");
        map1.put("c", "1");
        map1.put("z", "1");
        map1.put("d", "1");

        Map<String, String> map2 = new HashMap<String, String>();
        map2.put("w", "1");
        map2.put("x", "1");
        map2.put("b", "1");
        map2.put("y", "1");
        map2.put("c", "1");
        map2.put("z", "1");

        Iterator<String> itr = map1.keySet().iterator();
        String key;
        while (itr.hasNext()) {
            key = itr.next();
            if (map2.containsKey(key)) {
                itr.remove();
                map2.remove(key);
            }
        }

        System.out.println(map1);
        System.out.println(map2);
    }
}

输出:

{a=1, d=1}
{w=1, y=1}

[更新]

使用Stream的解决方案:

map1.keySet()
    .stream()
    .filter(k -> map2.containsKey(k))
    .collect(Collectors.toList())
    .forEach(k -> {
        map1.remove(k);
        map2.remove(k);
    });

[另一更新]

下面给出的是第一个解决方案的紧凑版本(感谢 Holger ):

for (Iterator<String> itr = map1.keySet().iterator(); itr.hasNext();) {
    if (map2.keySet().remove(itr.next())) {
        itr.remove();
    }
}

关于java - 如何从两个 map 中删除相同的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61725272/

相关文章:

Python:从字典格式的文本/文件创建字典

java - 在html中使用spring标签

java - 如何通过远程方法发送数据

java - 服务器JVM不保留内存

javascript - 如何从以下 json 数组创建 Backbone 集合?

c# - 如何使用基于键的linq更改字典的值?

java - 什么控制着 Tomcat 应用程序 URL 的第一部分?

Rblpapi - 将 bdp 与 ISIN/Cusip 一起使用会出现错误

api - 如何从响应中提取 token 并将其传递给 SOAPUI 中的下一个 api 请求

java - 列表和 map 的通用集合?