java - 将具有公共(public)字段的不同对象的多个列表合并到另一个列表中

标签 java list merge performance

我试图将具有公共(public)字段的多个对象列表合并到另一个列表中。
例如: List、List、List、List
ObjA :字符串id;字符串名称,字符串a;字符串 b;
ObjB :字符串id;字符串地址;字符串 x;
ObjC :字符串id;字符串电话;串 y;
ObjD :字符串id;字符串邮政编码;

现在我想以一种非常有效的方式将这些列表合并到 List< ObjZ> 中。
ObjZ:字符串id;字符串名称,字符串a;字符串 b;字符串地址;字符串 x;字符串电话;串 y;字符串邮政编码;

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

最佳答案

使用 Map 而不是 List,并使所有 Objs 实现一个接口(interface),该接口(interface)定义了您用作键的 getId()。然后对于列表 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<String, ObjZ> map, Collection<? extends ObjCopier> list) {
  for (ObjCopier obj : list) {
    ObjZ z = getOrCreateObjZFromMap(map, obj.getId());
    obj.copyToObjZ(z);
  }
}

然后针对您拥有的所有列表调用 mergeObj()。

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

关于java - 将具有公共(public)字段的不同对象的多个列表合并到另一个列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23063410/

相关文章:

python - Pandas 中数据框行中的数据框列

java - 游戏服务器MySQL连接

java - 分布式系统

java - Gradle 对 Ubuntu 上的现有文件抛出 NoSuchFileException

java - 如何在java中使用动态数据创建多个数组列表

python - 如何合并两个列表?为集合操作保留相同的列表元素

java - Oracle 查询到 Hibernate 查询的转换

html - 菜单的无序列表没有间隔

javascript - 如何合并包含符号的javascript对象?

读取并绑定(bind)多个 csv 文件