読者です 読者をやめる 読者になる 読者になる

利用期間重複の詳細リストを求める(4)

過去に書いた以下、いずれも気に入らなくなってきた。

利用期間重複の詳細リストを求める(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