java公共对象_java – 将具有公共字段的不同对象的多个列表合并到另一个列表中...

本文介绍了一种使用Map和自定义接口将多个具有共同字段的Java对象列表高效地合并为单一列表的方法。此方法适用于拥有大量数据且需避免重复ID的情况。

我试图将多个对象列表与一个公共字段合并到另一个列表中.

例如:

列表与LT; ObjA>,List< ObjB>,List< ObjC>,List< ObjD&GT

ObjA:String id;字符串名称,字符串a;字符串b;

ObjB:String id;字符串地址;字符串x;

ObjC:String id;串电话;字符串y;

ObjD:String id;字符串邮政编码;

现在我想将这些列表合并到List< ObjZ&GT以非常有效的方式.

ObjZ:String id;字符串名称,字符串a;字符串b;字符串地址;字符串x;串电话;字符串y;字符串邮政编码;

任何人都可以帮我写一个有效的代码吗?

解决方法:

使用Map而不是List,并使所有Objs实现一个定义getId()的接口,该接口用作键.然后,对于List A-D中的每个条目,从Map获取(并可能创建ObjZ)并更新其详细信息.

你可以把它变得非常通用. Java伪代码:

interface ObjCopier {

String getId();

void copyToObjZ(ObjZ z);

}

例如

class ObjA implements ObjCopier {

...

String getId() { return id; }

void copyToObjZ(ObjZ z) {

z.setName(name);

z.setA(a);

...

}

}

然后最后一点合并它:

public void mergeObj(Map map, Collection extends ObjCopier> list) {

for (ObjCopier obj : list) {

ObjZ z = getOrCreateObjZFromMap(map, obj.getId());

obj.copyToObjZ(z);

}

}

并针对您拥有的所有列表调用mergeObj().

如果您正在讨论一个非常大的数据集,并且各种ObjA-ObjD中的字段没有重叠,您可以考虑使用一个线程池,其中每个mergeObj()方法都在不同的线程中运行.您需要同步getOrCreateObjZFromMap(),或者在启动线程之前预先创建所有ObjZ实例.这可以大大加快这个过程,但你的里程可能会有所不同,所以总是最好用反映你情况的数据进行测试.

标签:java,performance,list,merge

来源: https://codeday.me/bug/20190825/1715888.html

### Java 合并 List 对象根据多个相同字段 为了基于多个相同的字段合并两个 `List` 对象,在 Java 中可以采用自定义类,并覆盖 `equals()` 和 `hashCode()` 方法以确保这些字段用于比较。下面展示了一种方式,其中创建了一个实体类 `Person` 并指定了哪些字段应该参与去重逻辑。 #### 定义实体类 Person ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; // 只有当name和age都相等时才认为是同一个对象 return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); } } ``` 接着可以通过集合框架中的工具方法来完成合并与去重工作: #### 使用 Stream API 实现合并与去重 ```java import java.util.*; import java.util.stream.Collectors; // 假设有如下两个列表 List<Person> list1 = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25)); List<Person> list2 = Arrays.asList(new Person("Charlie", 35), new Person("Alice", 30)); // 将两个列表合并并通过stream api去除重复项 List<Person> mergedAndDistinctedList = Stream.concat(list1.stream(), list2.stream()) .distinct() .collect(Collectors.toList()); ``` 这段代码首先将两个 `List` 转换成流形式,之后调用了 `distinct()` 函数自动过滤掉那些依据 `equals()` 判断为相等的对象实例,最终再收集回新的 `List` 结构中[^1]。 对于更复杂的场景下可能还需要考虑其他因素比如性能优化等问题;外需要注意的是这里假设了所有要合并的 `List` 都是由同一类型的对象组成的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值