fork download
  1. import java.time.*;
  2. import java.time.temporal.ChronoUnit;
  3. import java.util.*;
  4. import java.util.stream.*;
  5.  
  6. public class Main {
  7. public static void main(String args[]) {
  8. List<Item> items = Arrays.asList(
  9. new Item(LocalDateTime.parse("2020-08-21T00:00:00"), LocalDateTime.parse("2020-08-21T00:02:00"), "item1"),
  10. new Item(LocalDateTime.parse("2020-08-21T00:01:00"), LocalDateTime.parse("2020-08-21T00:03:00"), "item2"),
  11. new Item(LocalDateTime.parse("2020-08-21T00:03:00"), LocalDateTime.parse("2020-08-21T00:07:00"), "item3"),
  12. new Item(LocalDateTime.parse("2020-08-21T00:04:00"), LocalDateTime.parse("2020-08-21T00:12:00"), "item4"),
  13. new Item(LocalDateTime.parse("2020-08-21T09:50:37"), LocalDateTime.parse("2020-08-21T09:56:49"), "item5"),
  14. new Item(LocalDateTime.parse("2020-08-21T09:59:37"), LocalDateTime.parse("2020-08-21T10:02:37"), "item6"),
  15. new Item(LocalDateTime.parse("2020-08-21T09:49:37"), LocalDateTime.parse("2020-08-21T09:51:37"), "item7"),
  16. new Item(LocalDateTime.parse("2019-12-31T23:59:37"), LocalDateTime.parse("2020-01-01T00:03:37"), "item8"),
  17. new Item(LocalDateTime.parse("2020-01-01T00:04:37"), LocalDateTime.parse("2020-01-01T00:06:37"), "item9"),
  18. // added to test a single entry within 5 min range
  19. new Item(LocalDateTime.parse("2020-01-01T00:42:37"), LocalDateTime.parse("2020-01-01T00:44:37"), "item10")
  20. );
  21.  
  22. items.stream()
  23. .flatMap(Main::convert)
  24. .collect(Collectors.groupingBy(x -> x.getKey(), LinkedHashMap::new, Collectors.mapping(x -> x.getValue(), Collectors.toList())))
  25. .entrySet().stream()
  26. .filter(x -> x.getValue().size() > 1)
  27. .forEach(System.out::println);
  28. }
  29.  
  30. public static Stream<Map.Entry<String, Item>> convert(Item item) {
  31. LocalDateTime start = getKey(item.getStartTime());
  32. LocalDateTime end = getKey(item.getEndTime()).plusMinutes(5);
  33.  
  34. return Stream
  35. .iterate(start, d -> d.plusMinutes(5))
  36. .limit(ChronoUnit.MINUTES.between(start, end) / 5)
  37. .map(d -> new AbstractMap.SimpleEntry(d + "**" + d.plusMinutes(5), item));
  38. }
  39.  
  40. public static LocalDateTime getKey(LocalDateTime time) {
  41. return LocalDateTime.of(time.getYear(), time.getMonthValue(), time.getDayOfMonth(), time.getHour(), time.getMinute() - time.getMinute() % 5);
  42. }
  43. }
  44.  
  45. class Item {
  46. final LocalDateTime startTime;
  47. final LocalDateTime endTime;
  48. final String name;
  49.  
  50. public Item(LocalDateTime s, LocalDateTime e, String n) {
  51. startTime = s;
  52. endTime = e;
  53. name = n;
  54. }
  55.  
  56. public LocalDateTime getStartTime() {return startTime;}
  57. public LocalDateTime getEndTime() {return endTime;}
  58. public String getName() {return name;}
  59. @Override
  60. public String toString() {
  61. return name;
  62. //return "{ " + String.join(", ", name, startTime.toString(), endTime.toString()) + " }";
  63. }
  64. }
Success #stdin #stdout 0.14s 38560KB
stdin
Standard input is empty
stdout
2020-08-21T00:00**2020-08-21T00:05=[item1, item2, item3, item4]
2020-08-21T00:05**2020-08-21T00:10=[item3, item4]
2020-08-21T09:50**2020-08-21T09:55=[item5, item7]
2020-08-21T09:55**2020-08-21T10:00=[item5, item6]
2020-01-01T00:00**2020-01-01T00:05=[item8, item9]