Java - заказанная карта - PullRequest
0 голосов
/ 24 апреля 2020

Мой код запрашивает у пользователя цифры от 0 до 100, а затем подсчитывает, сколько вхождений каждого ди git.

Я пытаюсь отсортировать мою TreeMap следующим образом:

Output

Это мой код ниже, и в настоящее время вывод не отсортирован. Я попытался реализовать метод по этой ссылке, https://beginnersbook.com/2014/07/how-to-sort-a-treemap-by-value-in-java/, но получил следующую ошибку:

причина: не могу вывести переменную типа (ов) K, V (несоответствие аргумента; ArrayList не может быть преобразован в Map), где K, V являются переменными типа: K extends Объект, объявленный в методе sortByValues ​​(Map) V extends Comparable, объявленный в методе sortByValues ​​(Map)

Есть предложения?

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

    ArrayList<Integer> Digits = new ArrayList<>();
    ArrayList<Integer> UniqueDigits = new ArrayList<>();
    System.out.print("Enter digits: ");
    int value;

    do {
        value = input.nextInt();
        if (value > 0 && value < 101) 
            Digits.add(value);
        } while (value != 0);


    Set<Integer> uniqueDigits = new HashSet<Integer>(Digits);
    Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>();
    for (Integer uniqueDigit : uniqueDigits) {
        frequencies.put(uniqueDigit, Collections.frequency(Digits, uniqueDigit));
    }


    // Printing
    for (Integer key : frequencies.keySet()) {

        if (frequencies.get(key) > 1) {
            System.out.println(key + " - " + frequencies.get(key) + " times");
            } else if (frequencies.get(key) == 1) {
            System.out.println(key + " - " + frequencies.get(key) + " time");
            }
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Вы не можете отсортировать TreeMap по значению. Я знаю, что ответ существует. Он пытается ответить на вопрос, похожий на: «Как приготовить кофе с помощью отвертки?» - просто не имеет смысла пытаться ответить на вопрос.

TreeMap автоматически сортируется по ключу.

Вот что он делает. Это не сортирует по значению и не может быть сделано без глупых хаков.

Итак, что вы можете сделать?

Для начала, забудьте о TreeMap. Я думаю, что ваше мышление пошло: мне нужна карта с какой-то сортировкой - позвольте мне взглянуть на API - о, есть эта вещь TreeMap, она упоминает сортировку - я буду использовать это. Как я уже говорил, TreeMap явно означает сортировка по ключам - если сортировка по ключам не то, что вы ищете, то TreeMap это не то, что вы ищете. Go с простой старой доброй картой jane.

Затем вы можете отсортировать значения путем потоковой передачи значений карты и их сортировки:

Map<Integer, Integer> map = new HashMap<>();
map.put(1, 10);
map.put(2, 5);
map.put(3, 30);

Comparator<Map.Entry<Integer, Integer>> comparator = Comparator.comparingInt(
    entry -> entry.getValue().intValue()).reversed();
System.out.println(map.entrySet().stream()
    .sorted(comparator)
    .map(entry -> String.format("%d occurs %d times.", entry.getKey(), entry.getValue()))
    .collect(Collectors.joining("\n")));

напечатает то, что вы хотите.

0 голосов
/ 24 апреля 2020

Вы можете использовать TreeMap

следующим образом:

  public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Map<Integer, Integer> frequencies = new TreeMap<>();
        System.out.print("Enter digits: ");
        int value;
        do {
            value = input.nextInt();
            if (value > 0 && value < 101)
                frequencies.put(Integer.valueOf(value), frequencies.getOrDefault(Integer.valueOf(value), 1) + 1);
        } while (value != 0);

        frequencies.entrySet().stream().sorted(Entry.<Integer, Integer>comparingByValue().reversed())
                .forEach((entry) -> {
                    if (frequencies.get(entry.getKey()) > 1) {
                        System.out.println(entry.getKey() + " - " + entry.getValue() + " times");
                    } else if (frequencies.get(entry.getKey()) == 1) {
                        System.out.println(entry.getKey() + " - " + entry.getValue() + " time");
                    }
                });
    }

, вывод:

5 - 5 times
1 - 4 times
6 - 3 times
23 - 3 times
...