降序排序: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<>(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
您的代码将中断。交换 o1
和 o2
就像在这段代码中所做的那样 可以更好地完成这项工作。【参考方案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操作排序(升序降序)