Java最有效的合并多个集/列表的方法

时间:2014-08-08 09:32:37

标签: java algorithm merge

我的基本问题是我有4种不同的数据源(DS1,DS2,DS3,DS4),我目前存储在4个不同的列表中。每个列表都填充了InformationObjects,这些对象有四个字段,如果它们存在则是标识符,但所有这些字段都不必存在。然后大约有20个字段包含有关该对象的随机信息。

我需要做的是将这些列表合并为一个新列表,如果来自不同数据源的两个对象具有相同的任何标识符,则应将它们视为同一个对象,并且应合并它们的字段。

示例:

Object1
  idField1: "123"
  idField3: "437"
  infoField1: "info1"
  infoField2: "info2"

Object2
  idField1: "123"
  idField2: "gfd"
  idField4: "9987"
  infoField3: "info3"
  infoField4: "info4"

Object3
  idField2: "gfd"
  infoField5: "info5"

Merged
  idField1: "123"
  idField2: "gfd"
  idField3: "437"
  idField4: "9987"
  infoField1: "info1"
  infoField2: "info2"
  infoField3: "info3"
  infoField4: "info4"
  infoField5: "info5"

这次合并将会很多,所以我需要找到最快的方法。所以我的问题是你如何以最有效的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

List<InformationObject> doMerge()
{
  Map<String, List<InformationObject>> map = new HashMap<>();
  addData(map, ds1);
  addData(map, ds2);
  addData(map, ds3);
  addData(map, ds4);

  List<InformationObject> result = new ArrayList<>();
  for(List<InformationObject> ios: map.values())
  {
    InformationObject io = mergeObjects(ios);
    result.add(io);
  }
  return result;
}

private void addData(Map<String, List<InformationObject>> map, Datasource ds)
{
   for(InformationObject io : ds...)
   {
     String id = io.getId();
     List<InformationObject> list = map.get(id);
     if(list == null) list = new ArrayList<>();
     list.add(io);
   }
}