使用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)
中执行此操作
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;