降序排序:Java Map

Posted

技术标签:

【中文标题】降序排序:Java Map【英文标题】:Sorting Descending order: Java Map 【发布时间】:2013-09-26 05:16:00 【问题描述】:

我想做的是按值对地图进行排序。我查看了 *** 网站上提供的许多问题,发现以下解决方案可以满足我的要求,但缺少一点小东西。

Link1: 排序图

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

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

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);

这似乎是一种不好的方法,因为我觉得这效率低下。有没有办法将链接中的解决方案更改为默认按降序排序。

【问题讨论】:

您会惊讶于效率低下和非效率低下。您应该运行一些测试...制作一张包含 50,000 个随机整数的地图并以这种方式排序,看看实际需要多长时间。 (并且这样做 100 次或更多,这样你就会得到一个很好的平均水平。)尽量不要去做你“觉得”效率低下的事情。 如果您真的阅读了链接答案中的 cmets,您会发现您使用的技术实际上是一个非常糟糕的主意。 ***.com/a/2581754/869736 是对这个问题的唯一普遍有效的答案。 【参考方案1】:

要将链接中的解决方案改为降序排序,只需反转条件即可:

...
// 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

...

【讨论】:

【参考方案2】:

你应该使用new TreeMap&lt;&gt;(Collections.reverseOrder());

Map<String, Integer> newMap = new TreeMap<>(Collections.reverseOrder());
newMap.putAll(myMap);

或反转现有的比较器,例如值比较器Collections.reverseOrder(comparator)。它的工作方式类似于您在调用 compare/compareTo 之前交换两个对象的方法。

【讨论】:

【参考方案3】:

您可以通过在开头添加减号来简单地反转比较方法的返回值:

return -((Integer) map.get(o2)).compareTo((Integer) map.get(o1));

【讨论】:

非常糟糕的主意。如果 compareTo 返回 Integer.MIN_VALUE 您的代码将中断。交换 o1o2 就像在这段代码中所做的那样 可以更好地完成这项工作。【参考方案4】:
    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();

现在你可以迭代迭代器并使用 iterator.hasNext() 和 iterator.next() 方法提取值......

【讨论】:

【参考方案5】:

这将起作用:

      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;
        
    );

【讨论】:

以上是关于降序排序:Java Map的主要内容,如果未能解决你的问题,请参考以下文章

java8新特性:对map集合排序,根据key或者value操作排序(升序降序)

看看java中map按value 降序的方法!!!

重载map排序(降序)

list<map> 排序,根据总分数排序,高手来,加分

根据值按降序对 Map<Key,Value> 进行排序 [重复]

根据另一个地图中的值对Java Map进行排序