Java 按值的降序对地图进行排序
我一直在尝试按Java 按值的降序对地图进行排序,java,dictionary,collections,Java,Dictionary,Collections,我一直在尝试按值的降序对地图进行排序,但我现有的代码是按键的降序进行排序的。如何按值的降序排序? 我的代码: 您的映射键类型是整数,因此您必须使用Comparator,而compare方法应采用整数输入,通过该整数键,您可以通过map.get(a)和map.get(b)获得双值。在TreeMap构造函数中,您必须定义您创建的comparator类。(即ValueComparator) 请参阅此代码: public static TreeMap<Integer, Double> Sor
值的降序对地图进行排序,但我现有的代码是按键的降序进行排序的。如何按值的降序排序?
我的代码:
您的映射键类型是整数,因此您必须使用Comparator
,而compare
方法应采用整数输入,通过该整数键,您可以通过map.get(a)
和map.get(b)
获得双值。在TreeMap
构造函数中,您必须定义您创建的comparator类。(即ValueComparator)
请参阅此代码:
public static TreeMap<Integer, Double> SortByValue(Map<Integer, Double> map) {
ValueComparator vc = new ValueComparator(map);
TreeMap<Integer, Double> sortedMap = new TreeMap<Integer, Double>(vc);\\constructor should be vc which extends Comparator
sortedMap.putAll(map);
return sortedMap;
}
class ValueComparator implements Comparator<Integer> {
Map<Integer, Double> map;
public ValueComparator(Map<Integer, Double> base) {
this.map = base;
}
@Override
public int compare(Integer a, Integer b) {
// TODO Auto-generated method stub
if (map.get(a) >= map.get(b)) {
return -1;
} else {
return 1;
}
}
}
公共静态树映射SortByValue(映射){
ValueComparator vc=新的ValueComparator(映射);
TreeMap sortedMap=newtreemap(vc);\构造函数应该是扩展比较器的vc
分类地图(地图);
返回分拣的DMAP;
}
类ValueComparator实现Comparator{
地图;
公共价值比较器(地图库){
this.map=base;
}
@凌驾
公共整数比较(整数a、整数b){
//TODO自动生成的方法存根
如果(map.get(a)>=map.get(b)){
返回-1;
}否则{
返回1;
}
}
}
使用不同的数据结构,或者您可以尝试自定义。如果您有密钥并且需要其背后的值,则可以使用映射快速访问(此处为O(logn))。正如@ElliottFrisch所建议的,你最好使用另一个数据结构。看看这个,阅读那里的评论,以及对高投票率答案的评论。这看起来类似于一个相关的问题。虽然它在某些情况下可能会工作,但请注意它有很大的限制,如果违反了这些限制,将导致模糊的bug。
Unsorted Map:{1=0.53, 2=0.48, 23=0.54, 10=0.47}
Sorted Map: {23=0.54, 10=0.47, 2=0.48, 1=0.53}
public static TreeMap<Integer, Double> SortByValue(Map<Integer, Double> map) {
ValueComparator vc = new ValueComparator(map);
TreeMap<Integer, Double> sortedMap = new TreeMap<Integer, Double>(vc);\\constructor should be vc which extends Comparator
sortedMap.putAll(map);
return sortedMap;
}
class ValueComparator implements Comparator<Integer> {
Map<Integer, Double> map;
public ValueComparator(Map<Integer, Double> base) {
this.map = base;
}
@Override
public int compare(Integer a, Integer b) {
// TODO Auto-generated method stub
if (map.get(a) >= map.get(b)) {
return -1;
} else {
return 1;
}
}
}