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

标签 java algorithm java-8 java-stream

获取两个流的交集,或者判断它们的交集是否为空在 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/

相关文章:

algorithm - 我可以使用 if 语句而不是三重嵌套 for 循环来使我的算法更快吗?

Java 不支持主要次要版本 52?尽管我没有使用 Oracle Java 1.8 的新功能,为什么会发生这种情况?

c++ - 电话号码中字母和数字的排列

java - 使用 DateTimeFormatter 显示短时区名称

list - 如何从 map 中获取 optional 值作为 optional 列表?

java - 为什么 GetLastError() 会阻止我的方法?

java - 设置 Android ActionBar Home/Up 按钮

java - 我是隐藏 WeakReferences 的含义还是强制客户端使用它们

java - 相当于 wsimport 的 org.apache.axis.components.net.SunFakeTrustSocketFactory

algorithm - 分区比排序更容易吗?