使用TreeMap按值排序遇到的问题

本文探讨了在使用Java的TreeMap进行按值排序时遇到的常见问题和解决方法,详细解释了TreeMap的内部工作机制,包括其如何依据比较器进行排序,并提供了示例代码展示如何自定义比较器以实现特定的排序需求。
摘要由CSDN通过智能技术生成

如果我们需要一个有序的Map,我们会使用TreeMap进行存储。TreeMap默认是按照key值升序进行排序的,如数字、ASCII。
如果我们需要对TreeMap按值进行排序的话,可以实例化Comparator接口,在TreeMap的构造方法中当作参数传入。这里遇到了问题:当插入TreeMap的两条数据value值一样的时候,后一条数据会覆盖前一条数据。
通过查资料发现,原因是实例化Comparator接口的时候,相当于自己实现了一个比较器,而TreeMap的插入与取出都是会经过比较器的。以如下代码为例:
public class ValueComparator implements Comparator<Object>{

	Map<Object, Object> base;
	
	public ValueComparator(Map<Object, Object> map){
		this.base = map;
	}
	
	@Override
	public int compare(Object o1, Object o2) {
		Integer value1 = Integer.parseInt(base.get(o1.toString()).toString());
		Integer value2 = Integer.parseInt(base.get(o2.toString()).toString());
		if ((value2 - value1) > 0) {
			return 1;
		}else if (value2 - value1 ==0) {
			return o2.toString().compareTo(o1.toString());
		}else {
			return -1;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值