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

日付期間重複の抽出

Java

昨日、書いた日付期間のインターフェース DateSpan
これを使って、

BiConsumer の 期間が重複している重複日と重複した要素のリストを処理するメソッドを用意します。

public static void booklist(List<? extends DateSpan> list, BiConsumer<LocalDate, List<? super DateSpan>> bookConsumer){
   AtomicInteger i = new AtomicInteger(0);
   Map<LocalDate, List<? super DateSpan>> map = new HashMap<>();
   list.stream().forEach(e->{
      list.subList(i.incrementAndGet(), list.size()).stream()
      .filter(t->e.isBook(t.start(), t.end()))
      .forEach(t->{
         SimpleEntry<LocalDate, LocalDate> key
          = new SimpleEntry<>(e.start().compareTo(t.start()) <= 0 && t.start().compareTo(e.end()) <= 0 ? t.start() : e.start()
               , e.start().compareTo(t.end()) <= 0 && t.end().compareTo(e.end()) <= 0 ? t.end() : e.end() );
         for(LocalDate dt=key.getKey(); dt.compareTo(key.getValue()) <= 0;dt=dt.plusDays(1)){
            List<? super DateSpan> plist = map.containsKey(dt) ? map.get(dt) : new ArrayList<>();
            plist.add(e);
            plist.add(t);
            map.put(dt, plist);
         }
      });
   });
   map.keySet().stream().sorted().forEach(k->{
      bookConsumer.accept(k, map.get(k).stream().distinct().collect(Collectors.toList()));
   });
}

使う時は、、

List<? extends DateSpan> list;

booklist(list, (k, t)->{
     // k = 重複発生日
     // t = 重複発生した日、1日に該当する要素のリスト、2個以上のリスト
});

ということです。