Как отсортировать этот HashMap при выравнивании / группировке, используя потоки? - PullRequest
2 голосов
/ 08 марта 2019

Я вчера задал вопрос о выравнивании / группировке HashMap. Я получил отличный ответ, который предложил мне сделать это.

return new ArrayList<>(map.entrySet().stream()
    .collect(Collectors.groupingBy(
        Map.Entry::getValue,
        Collectors.mapping(Map.Entry::getKey, Collectors.joining(","))))
    .values())

Однако я бы хотел, чтобы мой список символов, разделенных запятыми, сортировался в алфавитном порядке. В комментариях предлагалось использовать TreeMap::new в качестве аргумента для groupingBy(), но при этом мой список символов остается несортированным:

return new ArrayList<>(map.entrySet().stream()
    .collect(Collectors.groupingBy(
        Map.Entry::getValue,
        TreeMap::new,
        Collectors.mapping(Map.Entry::getKey, Collectors.joining(","))))
    .values())

Ниже мой оригинальный вопрос со ссылкой на пост.

Учитывая отображение букв на цифры, я хотел бы вернуть список строк, где каждая строка представляет собой список букв с разделителями-запятыми, сгруппированный по их ассоциированному номеру.

Для этой карты

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("A", 1);
    map.put("B", 2);
    map.put("C", 4);
    map.put("D", 1);
    map.put("E", 1);
    map.put("F", 2);

Я хотел бы вернуть список, содержащий:

"A,D,E" "B,F", "C"

Какие-либо предложения, как это можно сделать, используя функции потоковой передачи 1.8?

Как сгладить и сгруппировать этот HashMap, используя потоки?

Ответы [ 3 ]

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

Поверните карту на TreeMap перед выполнением операции, и ключи будут в порядке на выходе.

//                         * here
return new ArrayList<>(new TreeMap(map).entrySet().stream()
.collect(Collectors.groupingBy(
    Map.Entry::getValue,
    TreeMap::new,
    Collectors.mapping(Map.Entry::getKey, Collectors.joining(","))))
.values())
1 голос
/ 08 марта 2019

Это также может работать для вас:

return new ArrayList<>(map.entrySet().stream()
        .collect(Collectors.groupingBy(
                Map.Entry::getValue,
                TreeMap::new,
                Collectors.mapping(Map.Entry::getKey, Collectors.collectingAndThen(Collectors.toList(), l -> {
                    Collections.sort(l);
                    return String.join(",", l);
                }))))
        .values());
0 голосов
/ 08 марта 2019

Настроив один из ответов на связанный вопрос, это поможет добиться того, что вы ищете:

List<String> result = map.entrySet().stream()
        .collect(Collectors.groupingBy(Map.Entry::getValue))
        .values().stream()
        .map(e -> e.stream()
                .map(Map.Entry::getKey)
                .sorted() // <<< modified this
                .collect(Collectors.joining(",")))
        .collect(Collectors.toList());
...