Sorting Descending order: Java Map
我要做的是按值对地图进行排序。我研究了StackOverflow站点上提供的许多问题,发现下面的解决方案可以满足我的需要,但是缺少了一个小问题。
链接1:排序图
但我遇到的问题是,默认情况下,这是按值升序排序的。我想按降序排序:
所以我所做的是创建一个实现比较器的类
1 2 3 4 5 6 7 8 9
| 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 ));
}
} |
然后我把地图传给Treemap,
1 2 3
| MyComparator comp = new MyComparator (myMap );
Map <String, Integer > newMap = new TreeMap(comp );
newMap. putAll(myMap ); |
号
这似乎是一个糟糕的方法,因为我觉得这是低效的。是否有方法更改链接中的解决方案,默认情况下按降序排序。
- 你会惊讶于什么是低效的,而不是低效的。你应该做些测试…制作一张50000个随机整数的地图,然后这样排序,看看它实际需要多长时间。(做100次或更多,这样你会得到一个很好的平均值。)尽量不要去做你"感觉"低效的事情。
- 如果你真的阅读了链接答案中的评论,你会发现你使用的技术实际上是一个非常糟糕的主意。stackoverflow.com/a/2581754/869736是对这个问题的唯一答案,这个问题在一般情况下确实有效。
你应该使用new TreeMap<>(Collections.reverseOrder());。
1 2
| Map <String, Integer > newMap = new TreeMap <>(Collections. reverseOrder());
newMap. putAll(myMap ); |
号
或者反转现有的比较器,如值比较器Collections.reverseOrder(comparator)。它的工作方式类似于在调用compare或compareTo之前交换两个对象的方法。
1 2 3 4 5 6 7
| 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(); |
。
现在,您可以迭代迭代器并使用迭代器.hasNext()和迭代器.next()方法提取值……
这将起作用:
1 2 3 4 5 6 7
| 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;
}
}); |
您可以通过在开始处添加一个减号来简单地反转compare方法的返回值:
- 非常糟糕的主意。如果compareTo返回Integer.MIN_VALUE则代码中断。交换o1和o2,正如本代码中所做的那样,这样做做会更好。
要将链接中的解决方案更改为按降序排序,只需反转条件:
1 2 3 4 5 6 7 8 9 10
| ...
// 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
}
... |