一、题目
? 对这个map进行排序,要求是先排序value小->大再排序key小->大(在value相等的情况)
结果:
?
我感觉思路主要是这个比较器,非常丝滑!!!
new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
//当value相等的时候
if (o1.getValue().equals(o2.getValue())) {
//按照key升序
return o1.getKey().compareTo(o2.getKey());
}else {
//当value不相等的时候,按照value升序
return o1.getValue() - o2.getValue();
}
}
}
二、解法
1.比较传统的解法:ArrayList
?其中有任何不懂的请到QQ群来问我,免费解答~~? ?QQ群在我收藏了最多的博文里的
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("d", 2);
map.put("c", 1);
map.put("b", 4);
map.put("a", 3);
map.put("f", 6);
map.put("e", 6);
List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(infoIds,new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if (o1.getValue().equals(o2.getValue())) {
return o1.getKey().compareTo(o2.getKey());
}else {
return o1.getValue() - o2.getValue();
}
}
} );
infoIds.forEach(o1 -> {
System.out.println(o1.getKey() +":" + o1.getValue());
}
);
2.JAVA8 新特性:Stram
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("d", 2);
map.put("c", 1);
map.put("b", 4);
map.put("a", 3);
map.put("f", 6);
map.put("e", 6);
HashMap<String, Integer> collect = map.entrySet().stream().sorted(new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if (o1.getValue().equals(o2.getValue())) {
return o1.getKey().compareTo(o2.getKey());
}else {
return o1.getValue() - o2.getValue();
}
}//注意一定要用LinkedHashMap,否则打印出还是会乱序,只有LinkedHashMap会保留排序结果。用HashMap还是乱的。不信你可以试试
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));
collect.forEach((key, value) -> {
System.out.println(key + ":" + value);
});
三、总结
个人喜欢用stream感觉更加丝滑~? 不用提前开一个空间去处理,到collect需要的时候再开空间,比较符合思考。而且之后还有对排序好的内容进行过滤之类操作挺方便!!
|