Java TreeMap Comparator

2022-09-01 04:54:21

我需要一个树状图的比较器。我应该在树状图的构造函数中匿名编写此内容吗?否则我怎么能写我的比较器。目前,Java不喜欢我的代码(我可以匿名这样做吗?

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<Entry<String, Double>>()
    {
        public int compare(Entry<String, Double> o1, Entry<String, Double> o2)
        {
            return o1.getValue().compareTo(o2.getValue());
        } 
    });
  1. 我可以匿名进行上述操作吗?
  2. 否则我该怎么做?
  3. 我想按值而不是键对 myMap 进行排序

答案 1

不能对值的树状图进行排序。

基于红黑树的导航映射实现。地图根据其键的自然顺序进行排序,或者由创建地图时提供的比较器进行排序,具体取决于您需要提供的构造函数,以便比较器在键上进行比较。comparatorComparator<? super K>

要对值进行排序,您需要排序集。用

SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
            new Comparator<Map.Entry<String, Double>>() {
                @Override
                public int compare(Map.Entry<String, Double> e1,
                        Map.Entry<String, Double> e2) {
                    return e1.getValue().compareTo(e2.getValue());
                }
            });

  sortedset.addAll(myMap.entrySet());

举个例子

    SortedMap<String, Double> myMap = new TreeMap<String, Double>();
    myMap.put("a", 10.0);
    myMap.put("b", 9.0);
    myMap.put("c", 11.0);
    myMap.put("d", 2.0);
    sortedset.addAll(myMap.entrySet());
    System.out.println(sortedset);

输出:

  [d=2.0, b=9.0, a=10.0, c=11.0]

答案 2

比较器应仅用于密钥,而不是整个条目。它根据键对条目进行排序。

您应该将其更改为如下所示的内容

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<String>()
    {
        public int compare(String o1, String o2)
        {
            return o1.compareTo(o2);
        } 
});

更新

您可以执行以下操作(在地图中创建条目列表并根据值对列表进行排序,但请注意,这不会对地图本身进行排序) -

List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet());
    Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() {
        @Override
        public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
            return o1.getValue().compareTo(o2.getValue());
        }
    });

推荐