Я пытаюсь сделать что-то похожее на дерево Хаффмана. Когда я набираю zzzbbbbbbbbbaaaaacc, я получаю карту: [a=5, b=9, c=2, z=3]

Я думаю, что он упорядочивает его в алфавитном порядке, но это не то, что я хочу. Я хочу иметь такой порядок: [z=3, b=9, a=5, c=2] (пользовательский ввод начинается с z, затем b, затем a, затем c).

Мой код сейчас выглядит так:

public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        String s = scan.nextLine();

        Queue<Character> fifo = new LinkedList<Character>(); 
        for (Character character : s.toCharArray()) {
            fifo.add(character);
        }
        List<String> distinctElements = s.chars().mapToObj(e -> Character.toString((char) e)).distinct()
                .collect(Collectors.toList());

        Map<Character, Long> characters = s.chars().distinct().mapToObj((e -> (char) e))
                .collect(Collectors.toMap(c -> c, c -> s.chars().filter(ch -> ch == c).count()));
        
0
oktavia 4 Фев 2022 в 11:48
Вы пытались просто перебрать список и подсчитать элементы?
 – 
Charles
4 Фев 2022 в 11:55
2
Карта, которую Collectors.toMap создает по умолчанию, представляет собой HashMap, которая не сохраняет порядок вставки. Вместо этого попробуйте использовать LinkedHashMap. Кстати, я думаю, что ваша обработка выглядит более сложной, чем должна быть.
 – 
k314159
4 Фев 2022 в 11:56

2 ответа

Вы можете использовать сборщик toMap с аргументом конструктора карты:

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

import static java.util.stream.Collectors.toMap;

public class MapFromString {
    public static void main(String[] args) {
        try (Scanner scan = new Scanner(System.in)) {
            String s = scan.nextLine();

            Map<Character, Integer> map = s.chars()
                    .boxed()
                    .collect(
                        toMap(c -> Character.valueOf((char) c.intValue()), 
                              c -> 1, 
                              Integer::sum, 
                              LinkedHashMap::new));

            System.out.println(map);
        }
    }
}
1
Alex 4 Фев 2022 в 12:30

Вы должны использовать LinkedHashMap, эта структура поддерживает порядок вставленных в нее элементов.

В этом руководстве есть несколько примеров, чтобы увидеть его в действии: https://www.baeldung.com/java -linked-hashmap

0
AlexMelgar 4 Фев 2022 в 11:59