Перечислите <Date>на карту <Date, Integer>, показывающую количество элементов даты за каждую минуту - PullRequest
0 голосов
/ 26 марта 2019

У меня есть список объектов даты Java, и я хотел бы знать, сколько дат в одной минуте

Например, мой список в секундах эпохи

0
3
10
50
65
100

Должно привести к карте со следующим значением ключа

new Date(0) => 4
new Date(60000) => 2

Я в порядке с использованием библиотек для округления дат Java до минут.

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

java.time

List<Long> epochSeconds = List.of(0L, 3L, 10L, 50L, 65L, 100L);
Map<Instant, Long> countByMinute = epochSeconds.stream()
    .map(Instant::ofEpochSecond)
    .collect(Collectors.groupingBy(inst -> inst.truncatedTo(ChronoUnit.MINUTES), Collectors.counting()));
System.out.println(countByMinute);

Вывод:

{1970-01-01T00: 00: 00Z = 4, 1970-01-01T00: 01: 00Z =2}

Я полагаю, что вы не хотите использовать класс Date.Он плохо спроектирован и давно устарел.Вместо этого я использую java.time, современный Java-интерфейс даты и времени.С ним гораздо приятнее работать, и я считаю, что код понятнее для чтения.Если вам нужно посмотреть на карте, используя Date, который вы получаете от устаревшего API, который вы не можете изменить прямо сейчас, выполните преобразование в поиске.Например:

System.out.println("Count for new Date(60_000) is: "
    + countByMinute.get(new Date(60_000).toInstant()));

Счет для новой даты (60_000): 2

Если вы настаиваете, то, конечно, можно хранить Date объектовв качестве ключей карты (повторяю, не рекомендуется):

Map<Date, Long> countByMinute = epochSeconds.stream()
    .map(Instant::ofEpochSecond)
    .collect(Collectors.groupingBy(inst -> Date.from(inst.truncatedTo(ChronoUnit.MINUTES)), Collectors.counting()));
System.out.println(countByMinute);

Вывод на мой компьютер в часовом поясе Европы / Копенгагена:

{Чт 01 января 01:01:00 CET1970 = 2, четверг, 01 января 01:00:00 CET 1970 = 4}

Ссылка: Учебное пособие по Oracle: дата и время , объясняющее, как использовать Java.time

2 голосов
/ 26 марта 2019

Вы можете сделать это с:

Map<Integer, Long> result = seconds.stream().collect(Collectors.groupingBy(i -> i / 60, Collectors.counting()));

Если вы хотите собрать все вторые значения, используйте:

Map<Integer, List<Integer>> result = seconds.stream().collect(Collectors.groupingBy(i -> i / 60));

Если вы действительно хотите использовать Date Объекты (я бы этого не делал), вы можете использовать new Date(i / 60 * 60_000) вместо i / 60.

Я бы предложил вместо этого использовать java.time классы.

...