gpt4 book ai didi

Java 8 : How to compare all elements of a Set

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

这可能是一个已经问过的问题,但我找不到我需要的答案。

我有一个包含对象的集合

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/

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