首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在2 HashMaps中找到不同的值

在2 HashMaps中找到不同的值
EN

Stack Overflow用户
提问于 2016-01-28 14:21:12
回答 6查看 548关注 0票数 4

我有2 HashMaps和数百万的记录。为了简单起见,我将只处理很少的记录。我想找到地图a中的值,而不是映射b中的值。有这样的功能吗?最快的方法是什么?

代码语言:javascript
运行
复制
Map a = new HashMap();
a.put(1, "big");
a.put(2, "hello");
a.put(3, "world");

Map b = new HashMap();

b.put(1,"hello");
b.put(2, "world");

在这种情况下,输出应该是"big",因为它是在a中而不是在b中。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-01-28 14:24:11

您正在寻找映射值上的removeAll操作。

代码语言:javascript
运行
复制
public static void main(String[] args) {
    Map<Integer, String> a = new HashMap<>();
    a.put(1, "big");
    a.put(2, "hello");
    a.put(3, "world");

    Map<Integer, String> b = new HashMap<>();
    b.put(1,"hello");
    b.put(2, "world");

    a.values().removeAll(b.values()); // removes all the entries of a that are in b

    System.out.println(a); // prints "{1=big}"
}

values()返回此映射中包含的值的视图:

返回此映射中包含的值的Collection视图。集合由映射支持,因此对映射的更改反映在集合中,反之亦然。

因此,从值中删除元素可以有效地删除条目。这也是记录在案的:

集合支持元素删除,它通过Iterator.removeCollection.removeremoveAllretainAllclear操作从映射中删除对应的映射。

这会从地图上移除。如果您想要一个带有结果的新映射,您应该在一个新的map实例上调用该方法。

代码语言:javascript
运行
复制
Map<Integer, String> newMap = new HashMap<>(a);
newMap.values().removeAll(b.values());

备注:不要使用原始类型

票数 10
EN

Stack Overflow用户

发布于 2016-01-28 14:29:13

@Tunaki的解决方案工作得很好,可读性很强,而且很短。

为了完整起见,“手工”解决方案:

代码语言:javascript
运行
复制
for (String s : a.values()) {
    if (!b.containsValue(s)) {
        System.out.println (s);
        // process the value (e.g. add it to a list for further processing)
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-01-28 14:29:15

如果允许您使用4,则可以使用SetUtils.difference(),它的性能可能与@Tunaki的回答类似。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35064018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档