【问题标题】:Java most efficent way to merge several sets/listsJava合并多个集合/列表的最有效方法
【发布时间】:2014-10-01 17:47:37
【问题描述】:

我的基本问题是我目前存储在 4 个不同的列表中的 4 个不同的数据源(DS1、DS2、DS3、DS4)。每个列表都填充有 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"

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

【问题讨论】:

  • 你想要javascript还是java?
  • 保留顺序很重要,还是只需要将它们组合在一起而不需要任何重复?
  • @Kayaman 在java中,我只是使用json来更容易地呈现对象:)。
  • @CBHacking 顺序不重要,重要的是我可以组合任何标识符相同的对象。
  • 所以你的对象是字符串,字符串对?在这里使用 JSON 并没有让它更清晰。

标签: java algorithm merge


【解决方案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);
   }
}

【讨论】:

  • 如果我有一个 id 字段,我绝对可以看到它是如何工作的,但是当我有多个字段时我看不到它。我更新了我的原始帖子,以更清楚地显示数据的外观。抱歉,如果我从一开始就不清楚。从我可以看出,如果我使用您的示例 sn-p 对象 3 不会与对象 1 和 2 放在同一个列表中,因为对象 3 没有 idfield1?
  • @unzoomed 如果它没有id,你怎么知道它应该与哪个合并?或者你的意思是它可能在不同的领域有ID?只需修改示例以合并来自合并不同条件的数据源的列表。
  • @unzoomed 换句话说。例如。如果DS1DS2 应该被idField1 合并,合并它们。然后你将有一个合并列表DS1+DS2。然后用同样的算法合并DS1+DS2DS3使用idField2等等。
  • 感谢您的所有回复和努力!我会尝试这个解决方案,这似乎是一个合理的解决方案。但是我担心 DS1 在某些对象上使用 idField1 而在某些对象上使用 idField2 可能会遇到问题,这可能会导致问题。
  • @unzoomed 然后你可以有几个哈希图 - 每个合并字段一个。如果对象与任何 id 字段匹配,则合并对象。清楚怎么做吗?如果你需要,我可以写一个代码来说明。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2013-01-26
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2018-11-25
相关资源
最近更新 更多