, , . -, .
TreeMap<LocalDate,Integer> endPoints = new TreeMap<LocalDate,Integer>();
, , TreeMap, LocalDate . , , .
TimeInterval s. , , , . , Integer. , 1.
, , 1 Integer. , -1.
endPoints, "", .
List<TimeInterval> newList = new ArrayList<TimeInterval>();
iterating over endPoints. , endPoints. (LocalDate) currStart Integer (curr - ).
. :
curr > 0, TimeInterval currStart . newList.- Integer
curr. currStart.
.
: , . , . , , . , curr , , , , . "" , newList .
, , , , Joda Time ( , , ). TimeInterval:
public class TimeInterval {
private final Date validFrom;
private final Date validTo;
public TimeInterval(Date validFrom, Date validTo) {
this.validFrom = validFrom;
this.validTo = validTo;
}
public Date getStart() {
return validFrom;
}
public Date getEnd() {
return validTo;
}
@Override
public String toString() {
return "[" + validFrom + " - " + validTo + "]";
}
}
, , . , , Joda Interval ReadableInterval, .
. , Date LocalDate:
public static List<TimeInterval> breakOverlappingIntervals( List<TimeInterval> sourceList ) {
TreeMap<Date,Integer> endPoints = new TreeMap<>();
for ( TimeInterval interval : sourceList ) {
Date start = interval.getStart();
if ( endPoints.containsKey(start)) {
endPoints.put(start, endPoints.get(start) + 1);
} else {
endPoints.put(start, 1);
}
Date end = interval.getEnd();
if ( endPoints.containsKey(end)) {
endPoints.put(end, endPoints.get(start) - 1);
} else {
endPoints.put(end, -1);
}
}
int curr = 0;
Date currStart = null;
List<TimeInterval> targetList = new ArrayList<>();
for ( Map.Entry<Date,Integer> e : endPoints.entrySet() ) {
if ( curr > 0 ) {
targetList.add(new TimeInterval(currStart, e.getKey()));
}
curr += e.getValue();
currStart = e.getKey();
}
return targetList;
}
( , , , Integer, Integer, ).