GroupBy на ArrayList из HashMap в Java - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу выполнить группирование по arrayList из HashMap Структура данных.Поскольку мои данные не фиксированы, поэтому у меня нет фиксированных классов.Данные показаны как показано ниже.

[{"name":"laxman","state":"Karnataka","Mobile":9034782882}, 
{"name":"rahul","state":"Kerala","Mobile":9034782882}, 
{"name":"laxman","state":"karnataka","Mobile":9034782882}, 
{"name":"ram","state":"delhi","Mobile":9034782882}]

Вышеуказанные ключи не являются фиксированными, поэтому у меня не может быть классов для них.Данные и формулы будут динамичными.Но сейчас я беру этот пример, чтобы понять Stream.Collector на этих данных.

Теперь я хочу получить счет на основе name и state, поэтому в основном я хочу сгруппироватьпо имени и состоянию и хочу подсчитать.

Я пытался использовать Stream.Collector, но не смог добиться того, чего хочу.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вы можете сделать это с помощью Collectors.groupingBy, используя List в качестве ключа возвращаемого Map:

Map<List<String>, Long> result = yourListOfMaps.stream()
    .collect(Collectors.groupingBy(
        m -> Arrays.asList(String.valueOf(m.get("name")), String.valueOf(m.get("state"))),
        Collectors.counting()));

Это работает хорошо, потому что все реализации List в Java реализуют hashCode и equals последовательно, что является обязательным для каждого класса, который должен использоваться в качестве ключа любой Map реализации.

0 голосов
/ 19 сентября 2018

Вы не указали, какой ключ должен иметь ваш map. Исходя из предположения, что ключ map будет String, этот код будет делать то, что вы хотите.

Map<String, Long> dataByNameAndState = mapList.stream()
    .collect(Collectors.groupingBy(m -> m.get("name") + ": " + m.get("state"), 
        Collectors.counting()));
0 голосов
/ 18 сентября 2018

Группировать нужно дважды, один раз для клавиши и еще раз для значения.

Map<String, Map<Object, Long>> map = listOfMap.stream().flatMap(a -> a.entrySet().stream())
                .collect(Collectors.groupingBy(Map.Entry<String, String>::getKey,
                        Collectors.groupingBy(Map.Entry::getValue, Collectors.counting())));

Выход

{mobile={9034782882=4}, name={rahul=1, laxman=2, ram=1}, state={Karnataka=2, delhi=1, Kerala=1}}
...