【问题标题】:Merging two lists of different type objects [closed]合并两个不同类型对象的列表[关闭]
【发布时间】:2019-06-09 04:46:07
【问题描述】:

我有两个包含两种不同类型对象的列表,它们共享一些属性。让我们说 List usersDb 和 List usersLdap。 他们共享一个属性 - userId。我想将 usersDb 和 usersLdap 合并到另一种类型的对象列表中(使用一个列表中的一些数据和第二个列表中的一些数据)。重要的是列表可能有不同的大小。然后,该数据也应该在最终列表中,但是列表中没有出现它们的字段应该重新发送 null。

【问题讨论】:

  • 我将首先通过公共 userId 属性将每个列表转换为地图。然后遍历所有 id 并为最终列表构建对象
  • 你试过一些代码吗?请分享。

标签: java algorithm merge


【解决方案1】:

首先,将其中一个Lists(比如说List<UserLdap>)转换为由userId 索引的Map<String,UserLdap>(我假设它是String)会提高性能。

现在您可以遍历另一个List,并为每个元素搜索Map 是否包含匹配元素。使用这些元素创建合并类型的实例,并添加到输出 List

最后,您必须在转换为 MapList 中搜索在另一个 List 中没有对应元素的元素,将它们转换为合并类型,然后添加到输出List。为了使最后一步更有效,为其他 List 中存在的所有 userId 创建一个 Set<String> 可能会很有用。

【讨论】:

  • @Lino 哦,对不起。复制和粘贴错误。谢谢!
【解决方案2】:

可能看起来像这样(按用户 ID 映射列表,获取所有用户 ID - 或获取用户 ID 的交集,然后检查所有用户 ID,获取每个映射中的匹配值,创建您的第三个类型):

List<UserDb> listA = ...;
List<UserLdap> listB = ...;

Map<String, UserDb> a = listA.stream().collect(toMap(UserDb::getUserId, Function.identity());
Map<String, UserDb> b = listB.stream().collect(toMap(UserLdap::getUserId, Function.identity());

Set<String> allIds = new HashSet<>();
allIds.addAll(a.keySet());
allIds.addAll(b.keySet()); // Or retainAll if you want the intersection instead of the union

List<FinalType> = allIds.stream().map(id -> {
    UserDb userDb = a.get(id);
    UserLdap userLdap = b.get(id);
    FinalType t = // Build this one from the 2 others. Be careful that either can be null
    return t;
}).collect(toList());

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多