Я работаю над проектом, который меня смущает очень плохо.JAVA & Joda Time API: сравнивайте интервалы, обнаруживайте перекрывающиеся и генерируйте новые интервалы.
Учитывая это 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
Я использую API-интерфейс JODA Time, но поскольку я использую в первый раз, я действительно не знаю, как решить мою проблему. Я уже посмотрел на метод overlap()/overlapWith()
, но я до сих пор его не понимаю.
Ваша помощь очень ценится!
UPDATE я нашел что-то похожее на мою проблему >here<, но это не помогает мне сейчас.
Я попробовал это снова и снова, и даже если он работал в течение первых интервалов я проверил, это на самом деле не работает так, как я хотел.
Вот интервалы я были даны:
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
Я пытался исправить это в течение всего дня и Я до сих пор не добираюсь туда :(Любая помощь очень ценится!
[Это] (http://stackoverflow.com/questions/20677541/date-range-in-date-range/20678485#20678485) может помочь вам с некоторыми из них. – MadProgrammer