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

时间:2014-04-14 14:57:29

标签: java list merge performance

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

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

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

1 个答案:

答案 0 :(得分:6)

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

你可以使它非常通用。 Java伪代码:

interface ObjCopier {
  String getId();
  void copyToObjZ(ObjZ z);
}

e.g。

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