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