使用Java8和谓词,基于Id将三个异构列表合并为单个列表

使用Java8和谓词,基于Id将三个异构列表合并为单个列表,java,arraylist,collections,java-8,java-stream,Java,Arraylist,Collections,Java 8,Java Stream,我想根据字段将三种不同类型的列表合并为一个列表 A(id, val1) B(id, val2) C(id, val3) D(id, val1, val2, val3) 列表列表列表; 列表列表; 列表CList; 列表列表; 使用流和谓词将列表、BList、CList合并到DList 一种方法是使用n^2复杂度合并第一个列表和BList以获得DList(使用val1和val2); 然后再次使用n^2循环DList以CList填充val3。因此,复杂性将是巨大的 n^2+n^2=n^2 问题

我想根据字段将三种不同类型的列表合并为一个列表

A(id, val1)
B(id, val2)
C(id, val3)
D(id, val1, val2, val3)
列表列表列表;
列表列表;
列表CList;
列表列表;
使用流和谓词将列表、BList、CList合并到DList

一种方法是使用n^2复杂度合并第一个列表和BList以获得DList(使用val1和val2); 然后再次使用n^2循环DList以CList填充val3。因此,复杂性将是巨大的
n^2+n^2=n^2

问题1。有没有更好的方法来提高复杂性? 问题2。我想使用谓词和流来解决这个问题,从而使代码可读且简短。

如果您愿意使用
O(n)
额外的空间,可以在
O(n)
中执行此操作

  • 从三个列表中创建三个映射(hashmap)id映射到
    val1
    id
    映射到
    val2
    ,以及
    id
    映射到
    val3
    (通过迭代三个列表一次)
  • 循环浏览其中一个映射并构建
    列表
    。您可以访问
    O(1)
    中的其他
    val
    s

  • 编辑:这假设id对象已实现了
    等于
    哈希代码

    您所说的“合并”是什么意思?加入没有重复的列表?项目是否已排序?如果每个列表的大小相同,这意味着
    id
    s在所有三个列表中都是一致的,您也可以按
    id
    对它们进行排序并合并。那么它将是
    O(N*logN)
    。但是,是的,正如所建议的,您也可以在
    O(N)
    中这样做。只是关于复杂性的一点说明,可能值得一提的是每个列表的大小。列表的大小不多。。。而且它们也没有分类……是的,@greyfaire。。。不带重复项和不带项目的连接sorted@pj2494不建议在一个问题中提出多个问题,它们始终可以作为单独的线程链接。它还将有助于讨论不同线程中的复杂性细节,以及另一个线程中特定于实现的疑虑。另一方面,
    Predicate
    在您提出的解决方案中可能是好的,但除非共享实现,否则无法确定。所以,同样,一个复杂的线程现在已经完成,然后一个线程覆盖了实现细节,因为你可以创建另一个线程来提供正在使用的代码。我猜你是说HashMap?然后是的,给id对象一个好的hashCode,结果是O(n)。@GreyFairer-yes。这就是我的意思。
    List<A> AList;
    List<B> BList;
    List<C> CList;
    
    List<D> DList;