首页 > 解决方案 > Java - 有序映射

问题描述

我的代码提示用户输入 0 到 100 之间的数字,然后计算每个数字出现的次数。

我正在尝试按以下方式对我的 TreeMap 进行排序:

输出

这是我下面的代码,目前,输出未排序。我已尝试通过此链接https://beginnersbook.com/2014/07/how-to-sort-a-treemap-by-value-in-java/实现该方法,但出现以下错误:

原因:无法推断类型变量 K,V(参数不匹配;ArrayList 无法转换为 Map)其中 K,V 是类型变量:K 扩展方法 sortByValues(Map) 中声明的对象 V 扩展方法 sortByValues 中声明的 Comparable (地图)

有什么建议么?

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");
            }
        }
    }

}

标签: javatreemap

解决方案


您不能按值对 TreeMap 进行排序。我知道答案是存在的。它试图回答一个类似的问题:“我如何用螺丝刀煮咖啡?” - 试图回答这个问题是没有意义的。

TreeMap 会根据键自动对自身进行排序。

这就是它的作用。它不按价值排序,如果没有愚蠢的黑客,就不能这样做。

所以,你可以做什么?

对于初学者,忘记 TreeMap。我想你的想法是:我需要一个带有某种排序的地图 - 让我看看 API - 哦,有这个 TreeMap 的东西,它提到了排序 - 我会用它。正如我所介绍的,TreeMap 明确表示按键排序- 如果按键排序不是您要查找的内容,那么 TreeMap 不是您要查找的内容。使用简单的简好旧地图。

然后,您可以通过流式传输地图的值并对这些值进行排序来对值进行排序:

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")));

将打印你想要的。


推荐阅读