(资料图)
Map可以先按照value进行排序,然后按照key进行排序。 或者先按照key进行排序,然后按照value进行排序,这都是可以的。
并且,大家可以制定自己的排序规则。
按单个value排序:
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import static java.util.Map.Entry.comparingByValue;
import static java.util.stream.Collectors.toMap;
public class SortTest {
public static void main(String[] args) throws Exception {
// 创建一个字符串为Key,数字为值的map
Map budget = new HashMap<>();
budget.put("clothes", 120);
budget.put("grocery", 150);
budget.put("transportation", 100);
budget.put("utility", 130);
budget.put("rent", 1150);
budget.put("miscellneous", 90);
System.out.println("排序前: " + budget);
// 按值排序 升序
Map sorted = budget
.entrySet()
.stream()
.sorted(comparingByValue())
.collect(
toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
LinkedHashMap::new));
System.out.println("升序按值排序后的map: " + sorted);
// 按值排序降序
sorted = budget
.entrySet()
.stream()
.sorted(Collections.reverseOrder(comparingByValue()))
.collect(
toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
LinkedHashMap::new));
System.out.println("降序按值排序后的map: " + sorted);
}
} 按多个value排序:
data = data.stream().sorted(Comparator.comparing(o -> {
StringBuffer key = new StringBuffer();
fieldList.stream().forEach((a)-> {
key.append(o.get(a)+"");
});
return key.toString();
} )).collect(Collectors.toList());下面的代码中,首先按照value的数值从大到小进行排序,当value数值大小相同时,再按照key的长度从长到短进行排序,这个操作与Stream流式操作相结合。
/**
* Map按照整数型的value进行降序排序,当value相同时,按照key的长度进行排序
*
* @param map
* @return
*/
public static LinkedHashMap sortMap(Map map) {
return map.entrySet().stream().sorted(((item1, item2) -> {
int compare = item2.getValue().compareTo(item1.getValue());
if (compare == 0) {
if (item1.getKey().length() < item2.getKey().length()) {
compare = 1;
} else if (item1.getKey().length() > item2.getKey().length()) {
compare = -1;
}
}
return compare;
})).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
} package com.ethjava;
import java.util.*;
public class mappaixu1 {
public static void main(String[] args){
Map hashMap=new HashMap();
hashMap.put(1,10);
hashMap.put(5,7);
hashMap.put(2,9);
hashMap.put(3,7);
hashMap.put(3,6);//key是不可重复的,当这里再次输入Key=3时的,将会覆盖掉前面的(3,7)
hashMap.put(4,7);
//遍历
for(Map.Entry e:hashMap.entrySet()){
System.out.println("Key: "+e.getKey()+"对应的Value: "+e.getValue());
}
//Key: 1对应的Value: 10
//Key: 2对应的Value: 9
//Key: 3对应的Value: 6
//Key: 4对应的Value: 7
//Key: 5对应的Value: 7
//这里为什么自动按照key升序排序输出???为什么
// 某梦说,这里是因为凑巧正序输出,hashMap输出相对于输入是无序的。
//下面按照Value进行倒序排列
ArrayList> arrayList=new ArrayList>(hashMap.entrySet());
Collections.sort(arrayList,new Comparator>(){
@Override
public int compare(Map.Entry o1,Map.Entry o2 ){
//按照Value进行倒序,若Value相同,按照Key正序排序
//方法1:return o2.getValue() - o1.getValue();
//方法2:return o2.getValue().compareTo(o1.getValue());//对于Integer,String都是可以应用的
//按照Value进行倒序,若Value相同,按照Key倒序排序
int result = o2.getValue().compareTo(o1.getValue());
//方法学习:public int compareTo( NumberSubClass referenceName )
//referenceName -- 可以是一个 Byte, Double, Integer, Float, Long 或 Short 类型的参数。
//返回值:如果指定的数与参数相等返回0。
// 如果指定的数小于参数返回 -1。
//如果指定的数大于参数返回 1
if(result!=0){
return result;//即两个Value不相同,就按照Value倒序输出
}else{
return o2.getKey().compareTo(o1.getKey());}
//若两个Value相同,就按照Key倒序输出
}
});
//这里arrayList里的顺序已经按照自己的排序进行了调整
for(int i=0;i e:hashMap.entrySet()){
System.out.println(e);
//1=10
//2=9
//3=6
//4=7
//5=7
//这里表明hashMap中存取的内容顺序并没有进行任何改变,改变的是arrayList里的内容的顺序
}
}
} 参考文献:
https://blog.csdn.net/LvJinYang/article/details/102875095
https://blog.csdn.net/u014388729/article/details/80156645
到此这篇关于Map按单个或多个Value排序,当Value相同时按Key排序的文章就介绍到这了,更多相关Map按单个或多个Value排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
上一篇:和军人离婚需要什么手续
下一篇:最后一页
Map可以先按照value进行排序,然后按照key进行排序。或者先按照key进行
[爱卡汽车新车新闻原创]在6月17日举办的理想家庭科技日活动上,理想汽
不管您是富得流油的收藏控,还是想从中赚一笔的中间商,只要有机会一
木字旁加个危念什么1、拼音:wéi解释:竖立于船的甲板上的长杆,用来
市场需求延续弱势水泥行业进入转型升级阶段
海运费doc是什么费用,海运费REDI是什么费用这个很多人还不知道,现在让
齐白石在我们现在的我们现在的艺术家中,名气应该算得上数一数二的了。
1、自勉联:有志者、事竟成,破釜沉舟,百二秦关终属楚;苦心人、天不负,
在学校推同学了一下给同学开个玩笑,同学想要找人来打我
从昨天开始,洛阳迎来持续降雨,气温随之降低。
罗普特将依托国家博士后科研工作站,进一步加强与高校科研院所博士后科
记者从江苏省气象台了解到,从今天(6月17日)开始,江苏省淮河以南地
1、国际快递的收费标准:2、国际快递包裹重量分实际重量和体积重量两种
windows10修改开机密码方法是什么呢,很多用户不知道开机密码的修改方
1、1找到瑞恩宝箱,宝箱有一个。2、从酒店旅行者那里可获知随即地点有
6月15日召开的今年5月份国民经济运行情况发布会上,当前的就业形势引发
苏芒说早餐伙食费650元不够;王传君说卡里剩一百多万,感觉很慌;李湘
6月16日,南网储能(600995)融资买入890 37万元,融资偿还676 48万元
1、汗了,修罗挂日刀是成品。2、天工图修罗挂日刀是图纸。3、前者是后
不过天眼查显示,驷轩苑的成立时间为2020年11月16日,在公司首次开展新
1、这部纪录片涉及了大量最新的科研成就,比如光量子计算机、中国空间
航天员上太空已经不是新闻,近年来美国还发展出了商业航天业务,普通人
6月16日中国银保监会公开信息显示阳光人寿保险股份有限公司徐州中心支
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我
中国银行股份有限公司鄯善县支行收到中国银行保险监督管理委员会吐鲁番
X 关闭
X 关闭