TreeMap 自定义排序过程中的歧义

问题描述 投票:0回答:2

以下代码的输出是:

public static void main(String[] args) {
    String[] s = {"abc", "def", "ghi"};
    TreeMap<String, Integer> tm = new TreeMap<>((a, b) -> -a.length() + b.length());

    for (String k : s) {
        tm.merge(k, 1, Integer::sum);
    }

    System.out.println(tm);
    }

输出应该是:

{abc=1, def=1, ghi=1}
java oop collections frameworks
2个回答
1
投票

...输出应该是 {abc=1, def=1, ghi=1}

没有理由期待这种行为。每个比较操作都会为样本数据生成零(即“等于”),并且规范(即 Javadoc)中不保证

TreeMap
保留相等键的插入顺序。如果您想保留插入顺序,则需要使用
LinkedHashMap


0
投票

输出

{abc=3}
没有歧义。您使用自定义比较器,它将所有具有“相同长度”的键视为相同的键。最后,长度较大的键将位于开头。

P.S. TreeMap

Map
实现,其中键是唯一的,并按给定的
Comparator
排序。

    

© www.soinside.com 2019 - 2024. All rights reserved.