TreeMap按值排序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (589)

我想编写一个比较器,可以按值排序TreeMap,而不是默认的自然排序。我尝试了这样的,但无法找出问题所在:

import java.util.*;

class treeMap {
    public static void main(String[] args) {
        System.out.println("the main");
        byValue cmp = new byValue();
        Map<String, Integer> map = new TreeMap<String, Integer>(cmp);
        map.put("de",10);
        map.put("ab", 20);
        map.put("a",5);

        for (Map.Entry<String,Integer> pair: map.entrySet()) {
            System.out.println(pair.getKey()+":"+pair.getValue());
        }
    }
}

class byValue implements Comparator<Map.Entry<String,Integer>> {
    public int compare(Map.Entry<String,Integer> e1, Map.Entry<String,Integer> e2) {
        if (e1.getValue() < e2.getValue()){
            return 1;
        } else if (e1.getValue() == e2.getValue()) {
            return 0;
        } else {
            return -1;
        }
    }
}
提问于
用户回答回答于

这违反了SortedMap规范:

但是,使用外部集合时,Map.entrySet()可以按键,值或两者的组合(!!)进行排序。

这是一个返回一个SortedSet的泛型方法Map.Entry,给定Map其值为Comparable

static <K,V extends Comparable<? super V>>
SortedSet<Map.Entry<K,V>> entriesSortedByValues(Map<K,V> map) {
    SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
        new Comparator<Map.Entry<K,V>>() {
            @Override public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
                int res = e1.getValue().compareTo(e2.getValue());
                return res != 0 ? res : 1;
            }
        }
    );
    sortedEntries.addAll(map.entrySet());
    return sortedEntries;
}

现在可以执行以下操作:

    Map<String,Integer> map = new TreeMap<String,Integer>();
    map.put("A", 3);
    map.put("B", 2);
    map.put("C", 1);   

    System.out.println(map);
    // prints "{A=3, B=2, C=1}"
    System.out.println(entriesSortedByValues(map));
    // prints "[C=1, B=2, A=3]"

热门问答

腾讯会议共享屏幕,其他人收到的是黑屏?

你好,共享屏幕黑屏问题,可以先尝试把腾讯会议版更新到最新版本测试验证,如更新到最新版未能解决您的问题,可以填写以下信息: 【*会议号】 【*入会昵称】 【*注册手机号】 【*问题出现的腾讯会议版本】 【*出现平台以及版本:Android/iOS/win/mac/小程序】 【*出现...... 展开详请

实时音视频和小程序集成,设置合法域名 文档中少了一个域名?是否还有其他域名需要设置?

shixin

腾讯 · 高级产品经理 (已认证)

推荐

在开发工具上开启不校验合法域名即可,不影响真机运行,不需要配置,

Dr.Elephant支持hadoop3吗?还有编译一直有包找不到怎么解决?

目前TBDS的hadoop版本是2.7.2,建议配置文件中使用该版本号进行匹配

cos文件最大可以存储多大的问题件?

腾讯云技术服务团队

腾讯云 · 技术服务团队 (已认证)

腾讯云技术服务团队
推荐
COS简单上传最大可以上传5GB的文件,分片上传最大可以上传48.82TB (50,000GB )的文件。可参见COS产品文档https://cloud.tencent.com/document/product/436/14518 对于您提到的问题。js调用cos接口上传大于8M...... 展开详请

腾讯云IM使用不同视频创建视频消息的时候生成的缩略图都是一样,而且是透明的图片,为什么?

最爱开车啦互联网的敏感者
推荐
文档上已经有相关描述https://imsdk-1252463788.file.myqcloud.com/IM_DOC/Web/SDK.html?_ga=1.118341771.384230994.1576337691#createVideoMessage image.png ... 展开详请

如何用命令修改腾讯云解析目标ip?

氧化先生道可道 非常道 名可名 非常名
推荐
可以,参考: https://cns.api.qcloud.com/v2/index.php? &<公共请求参数> &Action=RecordCreate &domain=qcloud.com &subDomain=www &recordType=A &recordLine=默...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券