【问题标题】:Merge multiple list of different Objects with a common field into another list将具有公共字段的不同对象的多个列表合并到另一个列表中
【发布时间】:2014-05-28 14:36:39
【问题描述】:

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

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

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

【问题讨论】:

  • 我目前的解决方案是选择一个列表并循环遍历所有元素并将其中的每个元素与其他列表元素进行比较,这是我能想到的一种非常低效的方法。跨度>

标签: java list merge performance


【解决方案1】:

使用 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<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 实例。这可以大大加快这个过程,但您的里程可能会有所不同,因此最好使用反映您情况的数据进行测试。

【讨论】:

  • 太棒了。有用。谢谢你。由于我的分数很低,我无法投票给你的答案,但我真的很想投票给这个答案。
猜你喜欢
  • 2021-02-09
  • 2020-05-01
  • 1970-01-01
  • 2020-07-11
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多