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