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

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

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,您会发现您使用的技术实际上是一个非常糟糕的主意stackoverflow.com/a/2581754/869736 是对这个问题的唯一普遍有效的答案。

标签: java sorting hashmap


【解决方案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;
                }
            });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 2014-10-29
          • 1970-01-01
          • 2012-11-30
          • 2021-10-04
          • 2013-01-10
          相关资源
          最近更新 更多