Я работаю над проектом, который меня очень сильно смущает прямо сейчас.
Дан List<TimeInterval> list
, содержащий элементы класса TimeInterval
, который выглядит следующим образом:
public class TimeInterval {
private static final Instant CONSTANT = new Instant(0);
private final LocalDate validFrom;
private final LocalDate validTo;
public TimeInterval(LocalDate validFrom, LocalDate validTo) {
this.validFrom = validFrom;
this.validTo = validTo;
}
public boolean isValid() {
try {
return toInterval() != null;
}
catch (IllegalArgumentException e) {
return false;
}
}
public boolean overlapsWith(TimeInterval timeInterval) {
return this.toInterval().overlaps(timeInterval.toInterval());
}
private Interval toInterval() throws IllegalArgumentException {
return new Interval(validFrom.toDateTime(CONSTANT), validTo.toDateTime(CONSTANT));
}
Интервалы генерируются с использованием следующего:
TimeInterval tI = new TimeInterval(ld_dateValidFrom, ld_dateValidTo);
Интервалы в списке могут перекрываться:
|--------------------|
|-------------------|
Это должно привести к:
|-------||-----------||------|
Это должно НЕ привести к:
|--------|-----------|-------|
В общем, в цифрах:
I1: 2014-01-01 - 2014-01-30
I2: 2014-01-07 - 2014-01-15
Это должно привести к:
I1: 2014-01-01 - 2014-01-06
I2: 2014-01-07 - 2014-01-15
I3: 2014-01-16 - 2014-01-30
Я использую JODA Time API, но, поскольку я использую его впервые, я на самом деле понятия не имею, как решить мою проблему. Я уже посмотрел метод overlap() / overlapWith()
, но до сих пор не понимаю.
Ваша помощь очень ценится!
ОБНОВЛЕНИЕ Я нашел что-то похожее на мою проблему >здесь‹ но это мне пока не помогает.
Я пробовал его снова и снова, и хотя он работал на первых интервалах, которые я тестировал, на самом деле он не работал так, как я хотел.
Вот интервалы, которые мне дали:
2014-10-20 ---> 2014-10-26
2014-10-27 ---> 2014-11-02
2014-11-03 ---> 2014-11-09
2014-11-10 ---> 2014-11-16
2014-11-17 ---> 9999-12-31
Это функция, которую я использую для создания новых интервалов:
private List<Interval> cleanIntervalList(List<Interval> sourceList) {
TreeMap<DateTime, Integer> endPoints = new TreeMap<DateTime, Integer>();
// Fill the treeMap from the TimeInterval list. For each start point,
// increment the value in the map, and for each end point, decrement it.
for (Interval interval : sourceList) {
DateTime start = interval.getStart();
if (endPoints.containsKey(start)) {
endPoints.put(start, endPoints.get(start)+1);
}
else {
endPoints.put(start, 1);
}
DateTime end = interval.getEnd();
if (endPoints.containsKey(end)) {
endPoints.put(end, endPoints.get(start)-1);
}
else {
endPoints.put(end, 1);
}
}
System.out.println(endPoints);
int curr = 0;
DateTime currStart = null;
// Iterate over the (sorted) map. Note that the first iteration is used
// merely to initialize curr and currStart to meaningful values, as no
// interval precedes the first point.
List<Interval> targetList = new LinkedList<Interval>();
for (Entry<DateTime, Integer> e : endPoints.entrySet()) {
if (curr > 0) {
if (e.getKey().equals(endPoints.lastEntry().getKey())){
targetList.add(new Interval(currStart, e.getKey()));
}
else {
targetList.add(new Interval(currStart, e.getKey().minusDays(1)));
}
}
curr += e.getValue();
currStart = e.getKey();
}
System.out.println(targetList);
return targetList;
}
Вот как на самом деле выглядит вывод:
2014-10-20 ---> 2014-10-25
2014-10-26 ---> 2014-10-26
2014-10-27 ---> 2014-11-01
2014-11-02 ---> 2014-11-02
2014-11-03 ---> 2014-11-08
2014-11-09 ---> 2014-11-09
2014-11-10 ---> 2014-11-15
2014-11-16 ---> 2014-11-16
2014-11-17 ---> 9999-12-31
Вот как ДОЛЖЕН выглядеть вывод:
2014-10-20 ---> 2014-10-26
2014-10-27 ---> 2014-11-02
2014-11-03 ---> 2014-11-09
2014-11-10 ---> 2014-11-16
2014-11-17 ---> 9999-12-31
Поскольку в исходных интервалах нет перекрытия, я не понимаю, почему он производит такие вещи, как
2014-10-26 ---> 2014-10-26
2014-11-02 ---> 2014-11-02
2014-11-09 ---> 2014-11-09
etc
Я пытался исправить это весь день, и я все еще не дошел :( Любая дополнительная помощь очень ценится!