首页 > 解决方案 > 使用 Java 8 和谓词基于 Id 将三个异构列表合并为单个列表

问题描述

我想基于一个字段将三种不同类型的列表合并到一个列表中。

A(id, val1)
B(id, val2)
C(id, val3)
D(id, val1, val2, val3)
List<A> AList;
List<B> BList;
List<C> CList;
List<D> DList;

使用 Stream 和 Predicates 将 AList、BList、CList 合并到 DList。

一种方法是使用 n^2 复杂度合并第一个 AList 和 BList 以获得 DList(带有 val1 和 val2);然后循环 DList 以再次使用 n^2 用 CList 填充 val3。所以复杂性将是 n^2 + n^2 = n^2

Q1。有没有更好的方法来提高复杂性?Q2。我想使用 Predicate 和 Stream 来解决这个问题,所以使代码可读且短。

标签: javaarraylistcollectionsjava-8java-stream

解决方案


O(n)如果您愿意使用O(n)额外的空间,您可以这样做。

  1. 从三个列表中创建三个映射 (hashmap) - idto映射、 toval1映射和idtoval2映射(通过迭代三个列表一次)。idval3
  2. 循环遍历其中一张地图并构造List<D>. 您可以访问 中的其他vals O(1)

编辑:这假设 id 对象已经equals实现hashcode


推荐阅读