gpt4 book ai didi

java - 发现两个列表之间的差异

转载 作者:搜寻专家 更新时间:2023-10-31 20:34:08 26 4
gpt4 key购买 nike

在java中假设我有2个列表

List<Object1> list1
List<Object2> list2

object1.getName(); returns a String
object2.getName(); return a String

有什么方法可以比较名称并获得两个列表的差异

这两个对象是在第 3 方库中定义的,我无法覆盖 equals 和 compareto 方法

我赞成 googles Guava 或 commons collections library

但是 Sets.symmetricDifference(Set1, Set2) 要求传入 2,即使我使用 Sets.newHashSet(lis1) 和 Sets.newHashSet(lis2) 创建两个集合但他们在集合中仍然有不同类型的对象。

或者在 commons CollectionUtils.disjunction(lis1, list2) 列表中仍然必须包含相同的对象类型

不做 2 个昂贵的 for 循环,还有其他方法吗?

最佳答案

首先,我们将构建两个映射,每个列表一个,将名称映射到对象。然后我们遍历键集之间的差异,处理具有该名称的任何一种对象。这些 map 让我们避免扫描列表以寻找具有该名称的对象。 (在使用 Map 而不是 Multimap 时,我依赖于 the asker's comment on another answer,在每个列表中,名称是唯一的。如果您仍在使用 Java 7,请将方法引用替换为 Function 实现。)

Map<String, Object1> map1 = Maps.uniqueIndex(list1, Object1::getName);
Map<String, Object2> map2 = Maps.uniqueIndex(list2, Object1::getName);
for (String name : Sets.difference(map1.keySet(), map2.keySet()))
processObject1(map1.get(name));
for (String name : Sets.difference(map2.keySet(), map1.keySet()))
processObject2(map2.get(name));

如果您只想在一个列表中构建列表或对象集,processObject1processObject2 可以将对象添加到集合中。

uniqueIndex 的迭代顺序是输入 iterable 的迭代顺序,difference 返回一个 SetView,其迭代顺序与其第一个参数相同,因此您可以处理对象它们在输入列表中出现的顺序,如果该顺序与您的问题相关的话。


Java 8 流提供基本相同的功能:

Map<String, Object1> map1 = list1.stream().collect(Collectors.toMap(Function.identity(), Object1::getName));
Map<String, Object2> map2 = list2.stream().collect(Collectors.toMap(Function.identity(), Object2::getName));
map1.keySet().stream().filter(n -> !map2.keySet().contains(n)).map(map1::get).forEachOrdered(o1 -> processObject1(o1));
map2.keySet().stream().filter(n -> !map1.keySet().contains(n)).map(map2::get).forEachOrdered(o2 -> processObject1(o2));

同样,如果您只想收集对象,可以将 forEachOrdered 调用替换为 collect(Collectors.toList())

关于java - 发现两个列表之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25764803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com