使用compareTo
覆盖的想法实现。如果需要精确获取重叠范围或其数量,请使用此选项。
public class Range implements Comparable<Range> {
private LocalDate startDate;
private LocalDate endDate;
public Range(LocalDate startDate, LocalDate endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
@Override
public int compareTo(Range range) {
if (range.endDate.compareTo(endDate) >= 0 && range.startDate.compareTo(endDate) >= 0) return 1;
if (range.endDate.compareTo(startDate) <= 0 && range.startDate.compareTo(startDate) <= 0) return -1;
return 0;
}
}
测试一下:
LocalDate May1 = LocalDate.of(2016, 5, 1);
LocalDate May3 = LocalDate.of(2016, 5, 3);
LocalDate May5 = LocalDate.of(2016, 5, 5);
LocalDate May7 = LocalDate.of(2016, 5, 7);
LocalDate May9 = LocalDate.of(2016, 5, 9);
Set<Range> ranges = new HashSet<>();
ranges.add(new Range(May1, May5));
ranges.add(new Range(May3, May7));
ranges.add(new Range(May7, May9));
Set filteredRanges = ranges.stream().collect(Collectors.toCollection(TreeSet::new));
long totalOverlaps = ranges.size() - filteredRanges.size();
System.out.println(totalOverlaps + " overlapping range(s)");
请注意,范围 {
1..3, 3..5
} 被认为是不重叠的。如果要将这种情况(当一个范围的
endDate
等于另一个范围的
startDate
时)视为重叠,请用
<
,
>
替换
<=
,
>=
。
Set
--因此顺序不重要--并且您没有以任何方式修改任何Set
,如果您的Set
很大,您可能会发现使用parallelStream()
有优势,这可以加快速度。 - dcsohl