gpt4 book ai didi

java - 查找流交集是否为非空

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:26 25 4
gpt4 key购买 nike

获取两个流的交集,或者判断它们的交集是否为空在 Java 中通常是不可能的,因为流只能使用一次,并且通用解决方案有一个 O(m*n)复杂性。

如果我们对底层供应商的性质一无所知,我们最多可以逃避一个流和一个集合:

<T> boolean intersects(final Stream<T> c1, final Collection<T> c2) {
return c1.filter(c2::contains).findAny().isPresent();
}

不过,如果我们的两个供应商都表示使用相同比较器排序的有序集合(在最简单的情况下,Comparable 的两个 TreeSet >s)?在这种情况下,解决方案将具有线性复杂性(或者更准确地说,O(m*n),请参阅 this 答案)。

现在的问题是:能否使用 Stream API(即使用两个流作为输入)来实现上述线性解决方案?

最佳答案

您可以将第二个 Stream 收集到 Set 中,然后询问第一个 Stream 的任何元素是否包含在该集合中:

<T> boolean intersects(final Stream<T> c1, final Stream<T> c2) {
return c1.anyMatch(c2.collect(Collectors.toSet())::contains);
}

c1 的集合在其中的元素数量方面是线性的,contains 是一个常数时间操作。

关于java - 查找流交集是否为非空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37463049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com