Группировка записей HashBasedTable на основе строки DateTime - PullRequest
0 голосов
/ 12 марта 2019

У меня есть HashBasedTable (com.google.common.collect.HashBasedTable) в следующем формате: Table<DateTime, C, V>.DateTime исходит от org.joda.time.DateTime.

Я хотел бы сгруппировать записи на основе определенного интервала времени.Например, если записи A и B находятся в пределах 100 мс друг от друга, я хотел бы сгруппировать их в одной строке.У меня есть возможность сделать это при вставке, а также после вставки во время обработки.Как мне сделать это наиболее эффективным способом?

Справочные ссылки:

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/HashBasedTable.html

https://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html

1 Ответ

1 голос
/ 12 марта 2019

Вот пример.

    Table<DateTime, String, String> yourTable = // your HashBasedTable;
    Map<DateTime, List<Map<String, String>>> groupedRows = yourTable.rowMap()
            .entrySet()
            .stream()
            .collect(Collectors.groupingBy(e -> e.getKey().minusMillis(e.getKey().getMillisOfSecond() % 100),
                    Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

Для того, чтобы использовать поток, я сначала вызываю rowMap, чтобы получить Map<DateTime, Map<C, V>>, что является потоком.Поток записей карты.Я группирую их по дате и времени, усеченной до ближайших 100 миллисекунд.Способ усечения: если время составляет 6150 мс, e.getKey().getMillisOfSecond() % 100 дает мне 50 мс, которые я вычитаю, чтобы получить 6100 мс.Таким образом, все времена от 6100 до 6199 миллисекунд сгруппированы вместе.В группировке я использую нисходящий коллектор , чтобы выбрать значения (Map<C, V> s) из записей для внутренних списков в результате.

Отказ от ответственности: я не получилУстановлены основные библиотеки Guava / Google, поэтому я не все проверил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...