gpt4 book ai didi

java - 比较具有不同对象的 2 个列表以查找 equals 对象属性

转载 作者:行者123 更新时间:2023-12-01 22:35:39 28 4
gpt4 key购买 nike

我正在寻找在 Java 中执行此操作的优雅且有效的方法:

public class Object1{
String name;
int age;
}

public class Object2{
String name;
String adress;
}

List<Object1> list1;
List<Object2> list2;

我想找出list1中的每个Object1是否在list2中存在同名的Object2。还有比我下面写的更好的方法吗?

for (Object1 element1 : list1) {
for (Object2 element2 : list2) {
if (element2.name.equals(element1.name)){
// DO MY STUFF
}
}
}

最佳答案

我可能会使用 map :

Map<String, Object1> m = new HashMap<>();
for( Object1 o1 : list1 ) {
m.put(o1.name, o1);
}

for( Object2 o2 : list2 ) {
Object1 o1 = m.get(o2.name);
if( o1 != null ) {
//do something
}
}

如果允许多个具有相同名称的对象,您可以使用支持此功能的 map ,例如谷歌 Guava 的Multimap ,或 Map<String, List<Object1>>并自己维护列表。

这应该将复杂度降低到 O(n+m),构建 map 的复杂度为 O(n),检查 list2 的复杂度为 O(m)。构建 map 会产生一些恒定的开销,但根据这些列表的大小,这可能会带来相当大的加速。

更新:

我对排序优先和映射方法做了一个快速基准测试,尽管排序优先可能没有高度优化(我使用 Collections.sort() 然后同时迭代两个集合),但映射方法似乎很快就得到了更多高效。

以下是我的机器的一些结果:

size  sort-first  map-lookup
100 2 ms 1 ms
500 5 ms 2 ms
1000 7 ms 3 ms
5000 20 ms 8 ms
10000 37 ms 14 ms

关于java - 比较具有不同对象的 2 个列表以查找 equals 对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26905537/

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