Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
排序降序:Java映射_Java_Sorting_Hashmap - Fatal编程技术网

排序降序:Java映射

排序降序:Java映射,java,sorting,hashmap,Java,Sorting,Hashmap,我要做的是按值对地图排序。我浏览了stackoverflow站点上的许多问题,发现下面的解决方案符合我的要求,但遗漏了一件小事 :分类图 但我遇到的问题是,默认情况下,这是按值升序排序的。我想按降序排列: 所以我所做的就是创建了一个类来实现一个比较器 class MyComparator implements Comparator { Map map; public MyComparator(Map map) { this.map = map; }

我要做的是按值对地图排序。我浏览了stackoverflow站点上的许多问题,发现下面的解决方案符合我的要求,但遗漏了一件小事

:分类图

但我遇到的问题是,默认情况下,这是按值升序排序的。我想按降序排列:

所以我所做的就是创建了一个类来实现一个比较器

class MyComparator implements Comparator {
    Map map;
    public MyComparator(Map map) {
        this.map = map;
    }
    public int compare(Object o1, Object o2) {
        return ((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
    }
}
然后我把地图递给树形地图

MyComparator comp = new MyComparator(myMap);
Map<String, Integer> newMap = new TreeMap(comp);
newMap.putAll(myMap);
mycomprator comp=新的mycomprator(myMap);
Map newMap=newtreemap(comp);
newMap.putAll(myMap);

这似乎是一个糟糕的方法,因为我觉得这是低效的。是否有办法将链接中的解决方案更改为默认按降序排序

要将链接中的解决方案更改为按降序排序,只需颠倒条件:

...
// Note: this comparator imposes orderings that are inconsistent with equals.    
public int compare(String a, String b) {
    if (base.get(a) >= base.get(b)) {
        return 1; // For ascending, return -1;
    } else {
        return -1; // For ascending, return 1;
    } // returning 0 would merge keys
}
...

您应该使用
newtreemap(Collections.reverseOrder())

Map newMap=newtreemap(Collections.reverseOrder());
newMap.putAll(myMap);

或反转现有比较器,如值比较器
集合。反转顺序(比较器)
。它的工作原理类似于在调用
compare
/
compare to
之前交换两个对象。您只需在开始处添加减号,即可反转compare方法的返回值:

return -((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
TreeMap TreeMap=newtreemap();
NavigableMap nmap=treeMap.downingmap();
Set=nmap.entrySet();
迭代器迭代器=set.Iterator();
现在,您可以在迭代器上迭代,并使用迭代器.hasNext()和迭代器.next()方法提取值……

这将起作用:

      TreeMap<Integer, Integer> reverseInteger=new TreeMap<>(new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o2>o1?1:o2==o1?0:-1;
        }
    });
TreeMap reverseInteger=新的TreeMap(新的比较器(){
@凌驾
公共整数比较(整数o1,整数o2){
返回o2>o1?1:o2==o1?0:-1;
}
});

你会惊讶于什么是效率,什么不是效率。你应该运行一些测试。。。制作一张50000个随机整数的地图,并按这种方式排序,看看实际需要多长时间。(这样做100次或更多次,你会得到一个很好的平均值。)试着不要去做你“觉得”效率低下的事情。如果你真的阅读了链接答案中的评论,你会发现你使用的技术实际上是一个非常糟糕的主意。这是这个问题的唯一答案,在一般情况下确实有效。这是个糟糕的主意。如果
compareTo
返回
Integer.MIN\u值
则代码中断。交换
o1
o2
,就像本代码中已经做的那样,这样做会更好。
    TreeMap<Long,String> treeMap = new TreeMap<Long,String>();

    NavigableMap <Long, String> nmap = treeMap.descendingMap();

    Set<Long, String> set = nmap.entrySet();

    Iterator<Long, String> iterator = set.iterator();
      TreeMap<Integer, Integer> reverseInteger=new TreeMap<>(new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o2>o1?1:o2==o1?0:-1;
        }
    });