Java 类org.joda.time.base.AbstractInterval 实例源码
项目:exam
文件:DateTimeUtils.java
public static List<Interval> mergeSlots(List<Interval> slots) {
if (slots.size() <= 1) {
return slots;
}
slots.sort(Comparator.comparing(AbstractInterval::getStart));
boolean isMerged = false;
List<Interval> merged = new ArrayList<>();
merged.add(slots.get(0));
for (int i = 1; i < slots.size(); ++i) {
Interval first = slots.get(i - 1);
Interval second = slots.get(i);
if (!second.getStart().isAfter(first.getEnd())) {
merged.remove(i - 1);
DateTime laterEnding = first.getEnd().isAfter(second.getEnd()) ? first.getEnd() : second.getEnd();
merged.add(new Interval(first.getStart(), laterEnding));
isMerged = true;
} else {
merged.add(second);
}
}
if (isMerged) {
merged = mergeSlots(merged);
}
// Nothing to merge anymore
return merged;
}
项目:fili
文件:IntervalUtils.java
/**
* Collect all subintervals of an interval list of a grain bucketed size which are subintervals of another supply
* list of intervals.
*
* @param supplyIntervals The interval collection to match bucketedIntervals against
* @param bucketedIntervals The grain bucketed intervals to collect if they overlap the supply
* @param granularity Grain at which to split the bucketingIntervals
*
* @return a simplified list of subintervals of the bucketedIntervals list
*/
public static SimplifiedIntervalList collectBucketedIntervalsIntersectingIntervalList(
SimplifiedIntervalList supplyIntervals,
SimplifiedIntervalList bucketedIntervals,
Granularity granularity
) {
// Stream the from intervals, split by grain
Iterable<Interval> bucketedIterable = granularity.intervalsIterable(bucketedIntervals);
// Predicate to find buckets which overlap
Predicate<Interval> isIntersecting =
new SimplifiedIntervalList.SkippingIntervalPredicate(
supplyIntervals,
AbstractInterval::overlaps,
false
);
return StreamSupport.stream(bucketedIterable.spliterator(), false)
.filter(isIntersecting)
.collect(SimplifiedIntervalList.getCollector());
}