Java 如何从两个贴图中删除相同的关键点

Java 如何从两个贴图中删除相同的关键点,java,api,dictionary,java-8,interface,Java,Api,Dictionary,Java 8,Interface,我用Java创建了两个映射,其中包含相同类型的键和值: Map<Position,Movement> A; Map<Position,Movement> B; Map A; 地图B; 我想从它们中删除两个相同的键(而不是创建新的贴图)。我不在乎值是否不同。例如,如果A具有位置:a2,则移动:n,n和B具有位置:a2,则移动:1,2应删除这些条目 我想知道是否有一种快速的方法可以做到这一点,而无需迭代最短的映射并比较每个键 谢谢您可以在其中一个映射的keySet()上使

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

Map<Position,Movement> A;
Map<Position,Movement> B;
Map A;
地图B;
我想从它们中删除两个相同的键(而不是创建新的贴图)。我不在乎值是否不同。例如,如果
A
具有位置:
a2
,则移动:
n,n
B
具有位置:
a2
,则移动:
1,2
应删除这些条目

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


谢谢

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

Iterator<String> itr = map1.keySet().iterator();
String key;
while (itr.hasNext()) {
    key = itr.next();
    if (map2.containsKey(key)) {
        itr.remove();
        map2.remove(key);
    }
}
[更新] 使用
流的解决方案

map1.keySet()
    .stream()
    .filter(k -> map2.containsKey(k))
    .collect(Collectors.toList())
    .forEach(k -> {
        map1.remove(k);
        map2.remove(k);
    });
[另一更新] 以下是第一个解决方案的紧凑版本(感谢):

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

A.keySet().removeAll(B.keySet())
A
中删除
B
中的所有键是的,但我也想从B中删除键。只需在reverseyeah中执行该语句,这就是我编程的方式,但我正在寻找与API更相关的东西,并使用lambda表达式。谢谢您可以将
map2.containsKey(键)
直接替换为
map2.remove(键)!=null,然后删除if语句中的第二行。当然,这只在映射不允许null时起作用values@LauraGalera-我发布了一个使用
作为更新的工作解决方案。我希望它能满足您的要求。@Lino或
map2.keySet().remove(key)
,它直接返回一个
boolean
,并解决了
null
值的问题。它还支持更简洁的周围代码:
for(迭代器itr=map1.keySet().Iterator();itr.hasNext();)if(map2.keySet().remove(itr.next())itr.remove();
@Holger更好,添加得更好
map1.keySet()
    .stream()
    .filter(k -> map2.containsKey(k))
    .collect(Collectors.toList())
    .forEach(k -> {
        map1.remove(k);
        map2.remove(k);
    });
for (Iterator<String> itr = map1.keySet().iterator(); itr.hasNext();) {
    if (map2.keySet().remove(itr.next())) {
        itr.remove();
    }
}