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

Java是合并多个集合/列表的最有效方法,java,algorithm,merge,Java,Algorithm,Merge,我的基本问题是,我有4个不同的数据源(DS1、DS2、DS3、DS4),目前我将它们存储在4个不同的列表中。每个列表都充满了InformationObjects,这些对象有四个字段,如果它们存在的话,这些字段就是标识符,但它们不一定都存在。然后大约有20个字段包含关于对象的随机信息 然后我需要做的是将这些列表合并到一个新列表中,如果来自不同数据源的两个对象具有相同的任何标识符,则应将它们视为同一个对象,并合并它们的字段 例如: Object1 idField1: "123" idFiel

我的基本问题是,我有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"
这个合并将做很多,所以我需要找到最快的方式来做它。所以我的问题是,你如何才能以最有效的方式做到这一点

List-doMerge()
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);
   }
}
{ Map Map=newhashmap(); 添加数据(地图,ds1); 添加数据(地图,ds2); 添加数据(地图,ds3); 添加数据(地图,ds4); 列表结果=新建ArrayList(); 对于(列表ios:map.values()) { InformationObject io=合并对象(ios); 结果:添加(io); } 返回结果; } 私有void addData(映射、数据源ds) { 对于(信息对象io:ds…) { 字符串id=io.getId(); List=map.get(id); 如果(list==null)list=newarraylist(); 列表。添加(io); } }
您想要javascript还是java?保留顺序重要吗,还是只需要将它们组合在一起而不需要任何重复项?@Kayaman这是java语言,我只是使用json更容易地表示对象:)。@CBHacking顺序不重要,重要的是我可以组合具有相同标识符的对象。那么你的对象是字符串,字符串对?在这里使用JSON并不能让它变得更清晰。如果我只有一个id字段,我完全可以看到它是如何工作的,但是当我有几个id字段时,我看不到它。我更新了我原来的帖子,以便更清楚地显示数据的外观。对不起,如果我从一开始就不清楚。从我看到的情况来看,如果我使用你的示例代码片段,对象3不会与对象1和2放在同一个列表中,因为对象3没有idfield1?@unzomed如果它没有id,你怎么知道它应该与哪个合并?或者你的意思是它可能在不同的字段中有ID?只需修改示例以合并来自合并不同条件的数据源的列表。@换句话说,取消缩放。例如,如果
DS1
DS2
应该由
idField1
合并,则合并它们。然后您将拥有一个合并列表
DS1+DS2
。然后使用相同的算法合并
DS1+DS2
DS3
,使用
idField2
等等。感谢您的回复和努力!我将尝试这个解决方案,它似乎是合理的。但是,我担心DS1在某些对象上使用idField1,在某些对象上使用idField2可能会出现问题,这可能会导致问题。@unzomed然后您可能会有几个哈希映射-每个合并字段一个。如果某个对象与任何id字段匹配,则合并对象。怎么搞清楚了吗?如果你需要,我可以写一个代码来澄清。