我正在尝试使用Collections.sort()对地图元素(基于值)进行排序。问题是我的程序按降序对元素进行排序,而不是按升序排序。我怎样才能按升序排序?以下是我的代码。
package hashTableRR;
import java.util.*;
import java.util.Map.Entry;
public class OrderByValue {
public static void main(String [] args){
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 4);
map.put(2, 6);
map.put(3, 1);
map.put(4, 1);
map.put(6, 8);
map.put(7, 5);
Set<Entry<Integer, Integer>> set = map.entrySet();
List<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>(set);
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>()
{
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2){
return(o2.getValue()).compareTo(o1.getValue());
}
}
);
System.out.println("Keys\t\tValues");
for(Map.Entry<Integer, Integer> entry:list)
{
System.out.println(" "+entry.getKey()+"\t\t "+entry.getValue());
}
}
}
答案 0 :(得分:3)
只需更改compare
功能
return(o1.getValue()).compareTo(o2.getValue());
答案 1 :(得分:1)
问题可能出在Comparator#compare
实施中。
您将返回:o2.getValue().compareTo(o1.getValue())
对于升序,您应该返回:o1.getValue().compareTo(o2.getValue())
如果o1 < o2
,0
如果它们相等则会生成负值,如果o2 > o1
则为正值。
请参阅稍加密切的文档here。
通过以下方式深入了解了Comparator
在使用Java Integer
进行比较时可以期望返回的值(完整文档here):
如果此Integer等于参数Integer,则值为0;如果此Integer在数值上小于参数Integer,则小于0的值;如果此Integer在数值上大于参数Integer(带符号的比较),则值大于0。
答案 2 :(得分:1)
只需使用:
return(o1.getValue()).compareTo(o2.getValue());
显然会逆序
答案 3 :(得分:1)
Map<Integer, Integer> unsortedMap = new HashMap<>();
Map<Integer, Integer> sortedMap = new LinkedHashMap<>();
unsortedMap.put(1, 4);
unsortedMap.put(2, 6);
unsortedMap.put(3, 1);
unsortedMap.put(4, 1);
unsortedMap.put(6, 8);
unsortedMap.put(7, 5);
unsortedMap.entrySet().
stream().
sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed()).
forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));
System.out.println(sortedMap);
如果您希望按照将密钥插入
LinkedHashMap
的顺序存储数据,请使用Map
。HashMap
不保证任何订单。