利用期間重複の詳細リストを求める(1)
利用期間重複の詳細リストを求める(2)
利用期間重複の詳細リストを求める(2)-2
利用期間重複の詳細リストを求める(3)
)
とにかく、まずは重複しているだけのリストアップすること。
// createElementList は、対象のリスト生成
List<Element> list = createElementList();
// 重複があるものだけを抽出
List<Element> rlist = list.stream().flatMap(e->{
return list.stream().filter(t->{ if (e.equals(t)){ return false; }
return t.start_date.compareTo(e.end_date) <= 0 && t.end_date.compareTo(e.start_date) >= 0;
});
}).distinct().sorted*1.collect(Collectors.toList());
日付単位の重複状況、重複期間 Mapを求めるならこれをbase に、以下のようにする。
// 日付単位の重複状況
final Map<LocalDate, TreeSet<Element>> resultDailyMap = new HashMap<LocalDate, TreeSet<Element>>();
// 重複期間 Map
final Map<String, TreeSet<Element>> resultPeriodMap = new HashMap<String, TreeSet<Element>>();
// rlist = 重複するものだけのリストを抽出
List<Element> rlist = list.stream().flatMap(e->{
return list.stream().filter(t->{ if (e.equals(t)){ return false; }
if (t.start_date.compareTo(e.end_date) <= 0 && t.end_date.compareTo(e.start_date) <= 0){
LocalDate start = e.start_date.compareTo(t.start_date) <= 0 ? t.start_date : e.start_date;
LocalDate end = e.end_date.compareTo(t.end_date) <= 0 ? e.end_date : t.end_date;
IntStream.range(0, Period.between(start, end).getDays() + 1).mapToObj(i->start.plusDays(i)).forEach(d->{
TreeSet<Element> set = resultDailyMap.getOrDefault(d, new TreeSet<Element>*2.collect(Collectors.toList());
*1:e1, e2)->e1.start_date.compareTo(e2.start_date
*2:a, b)->a.start_date.compareTo(b.start_date)));
set.add(e);
set.add(t);
resultDailyMap.put(d, set);
String periodKey = start + "_" + end;
set = resultPeriodMap.getOrDefault(periodKey, new TreeSet<Element>((a, b)->a.start_date.compareTo(b.start_date)));
set.add(e);
set.add(t);
resultPeriodMap.put(periodKey, set);
});
return true;
}
return false;
});
}).distinct().sorted((e1, e2)->e1.start_date.compareTo(e2.start_date