作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这可能是一个已经问过的问题,但我找不到我需要的答案。
我有一个包含对象的集合
public class MyObject {
private LocalDate dateBeginning;
private LocalDate dateEnd;
public boolean overlap(MyObject otherDate) { /*code to check overlapping*/ }
}
我需要检查 Set 是否包含相互重叠的元素。在“旧 Java”中,我会遍历该集合两次并检查所有存在的组合,然后在找到它时中断或返回。
我们如何在 Java 8 中使用流和 lambda 来做到这一点?
我已经尝试过 reduction()
和 filter()
但它们似乎都不起作用
.filter((obj1, obj2) -> { if (obj1.overlap(obj2)) return true;}) //doesn't work
最佳答案
正如您在问题中所说,一个可能的解决方案是遍历该集合两次并确定是否存在任何重叠。所以我们需要确定的是,对于集合中的任何元素,我们是否可以找到任何其他不同的元素并与之重叠。
借助 Stream API,您可以拥有以下内容:
boolean overlap = set.stream()
.anyMatch(
o1 -> set.stream().anyMatch(o2 -> o1 != o2 && o1.overlap(o2))
);
anyMatch
将确定流中的任何元素是否满足给定条件。因此上面的代码询问是否有一个 o1
使得有一个 o2
不同于 o1
(我们可以安全地使用 ! =
这里因为两个对象都来自同一个集合)并且与之重叠。
请注意,这是一个复杂度为 O(n²) 的实现:该集合被遍历了两次。这在单次迭代中是可能的:在每次迭代中,保留间隔 [dateBeginning, dateEnd]
的并集;如果在任何时候当前区间和累积并集之间的交集是非空的,那么我们就知道已经命中重叠。
关于Java 8 : How to compare all elements of a Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37485369/
我是一名优秀的程序员,十分优秀!