Json数组列表中的数据分组排序、组内排序
文章目录
- 问题描述
- 方式一:先全部排序,在分组排序
- 方式二:使用HashMap取出来分组再组内排序
- 方式三:使用TreeMap取出来分组再组内排序
- 测试代码及耗时
问题描述
现在有一个用户信息数组,用户信息都在这个数组里,数组中有组号也有排序,现在需要将这些元素按照组号(groupNo)分组并排序,同时组内元素也按照排序字段(sortNum)排序?
示例json数组,分组排序之前
[{"userId": "7","userName": "neo1","groupNo": "3","sortNum": "2"
},
{"userId": "11","userName": "leo08","groupNo": "3","sortNum": "1"
},
{"userId": "15","userName": "zhangsan","groupNo": "3","sortNum": "8"
},
{"userId": "1","userName": "neo","groupNo": "1","sortNum": "2"
},
{"userId": "2","userName": "leo","groupNo": "1","sortNum": "8"
},
{"userId": "3","userName": "zhangsan","groupNo": "1","sortNum": "3"
},
{"userId": "4","userName": "neo1","groupNo": "2","sortNum": "6"
},
{"userId": "2","userName": "leo08","groupNo": "2","sortNum": "2"
},
{"userId": "3","userName": "zhangsan1","groupNo": "2","sortNum": "8"
}]
分组排序之后:
[{"list":[{"sortNum":"2","userName":"neo","userId":"1","groupNo":"1"},{"sortNum":"3","userName":"zhangsan","userId":"3","groupNo":"1"},{"sortNum":"8","userName":"leo","userId":"2","groupNo":"1"}],"groupNo":"1"},{"list":[{"sortNum":"2","userName":"leo08","userId":"2","groupNo":"2"},{"sortNum":"6","userName":"neo1","userId":"4","groupNo":"2"},{"sortNum":"8","userName":"zhangsan1","userId":"3","groupNo":"2"}],"groupNo":"2"},{"list":[{"sortNum":"1","userName":"leo08","userId":"11","groupNo":"3"},{"sortNum":"2","userName":"neo1","userId":"7","groupNo":"3"},{"sortNum":"8","userName":"zhangsan","userId":"15","groupNo":"3"}],"groupNo":"3"}
]
方式一:先全部排序,在分组排序
/*** 方式一:先全部排序,在分组排序** @return*/public static List<Map<String, Object>> sortByGroupNo1() {String jsonList = "[{\"userId\":\"7\",\"userName\":\"neo1\",\"groupNo\":\"3\",\"sortNum\":\"2\"},{\"userId\":\"11\",\"userName\":\"leo08\",\"groupNo\":\"3\",\"sortNum\":\"1\"},{\"userId\":\"15\",\"userName\":\"zhangsan\",\"groupNo\":\"3\",\"sortNum\":\"8\"},{\"userId\":\"1\",\"userName\":\"neo\",\"groupNo\":\"1\",\"sortNum\":\"2\"},{\"userId\":\"2\",\"userName\":\"leo\",\"groupNo\":\"1\",\"sortNum\":\"8\"},{\"userId\":\"3\",\"userName\":\"zhangsan\",\"groupNo\":\"1\",\"sortNum\":\"3\"},{\"userId\":\"4\",\"userName\":\"neo1\",\"groupNo\":\"2\",\"sortNum\":\"6\"},{\"userId\":\"2\",\"userName\":\"leo08\",\"groupNo\":\"2\",\"sortNum\":\"2\"},{\"userId\":\"3\",\"userName\":\"zhangsan1\",\"groupNo\":\"2\",\"sortNum\":\"8\"}]";List<Map<String, Object>> list = (List<Map<String, Object>>) JSON.parse(jsonList);List<String> groupNoList = new ArrayList<>();//使用比较器,先对分组进行排序list.sort(new Comparator<Map<String, Object>>() {@Overridepublic int compare(Map<String, Object> o1, Map<String, Object> o2) {if (!groupNoList.contains(o1.get("groupNo").toString())) {groupNoList.add(o1.get("groupNo").toString());}if (!groupNoList.contains(o2.get("groupNo").toString())) {groupNoList.add(o1.get("groupNo").toString());}if (Integer.valueOf(o1.get("groupNo").toString()) > Integer.valueOf(o2.get("groupNo").toString())) {return 1;} else if (Integer.valueOf(o1.get("groupNo").toString()) < Integer.valueOf(o2.get("groupNo").toString())) {return -1;} else {return 0;}}});//定义一个要返回的新的ListList<Map<String, Object>> returnList = new ArrayList<>();//先对分组列表排序Collections.sort(groupNoList);//对分组进行排序for (String groupNo : groupNoList) {Map<String, Object> newMap = new HashMap<>();newMap.put("groupNo", groupNo);newMap.put("list", new ArrayList<Map<String, Object>>());for (Map<String, Object> tmp : list) {if (groupNo.equals(tmp.get("groupNo").toString())) {List list1 = (List<Map<String, Object>>) newMap.get("list");list1.add(tmp);}}List<Map<String, Object>> list2 = (List<Map<String, Object>>) newMap.get("list");list2.sort(new Comparator<Map<String, Object>>() {@Overridepublic int compare(Map<String, Object> o1, Map<String, Object> o2) {if (Integer.valueOf(o1.get("sortNum").toString()) > Integer.valueOf(o2.get("sortNum").toString())) {return 1;} else if (Integer.valueOf(o1.get("sortNum").toString()) < Integer.valueOf(o2.get("sortNum").toString())) {return -1;} else {return 0;}}});returnList.add(newMap);}return returnList;}
本来就写了上面一个方法,但是作为程序员,需要尽可能的提高性能,我接下来又提供了两种实现方式:
方式二:使用HashMap取出来分组再组内排序
/*** 方式二:直接使用HashMap取出来所有分组,在进行分组排序,组内排序*/public static List<Map<String, Object>> sortByGroupNo2() {String jsonList = "[{\"userId\":\"7\",\"userName\":\"neo1\",\"groupNo\":\"3\",\"sortNum\":\"2\"},{\"userId\":\"11\",\"userName\":\"leo08\",\"groupNo\":\"3\",\"sortNum\":\"1\"},{\"userId\":\"15\",\"userName\":\"zhangsan\",\"groupNo\":\"3\",\"sortNum\":\"8\"},{\"userId\":\"1\",\"userName\":\"neo\",\"groupNo\":\"1\",\"sortNum\":\"2\"},{\"userId\":\"2\",\"userName\":\"leo\",\"groupNo\":\"1\",\"sortNum\":\"8\"},{\"userId\":\"3\",\"userName\":\"zhangsan\",\"groupNo\":\"1\",\"sortNum\":\"3\"},{\"userId\":\"4\",\"userName\":\"neo1\",\"groupNo\":\"2\",\"sortNum\":\"6\"},{\"userId\":\"2\",\"userName\":\"leo08\",\"groupNo\":\"2\",\"sortNum\":\"2\"},{\"userId\":\"3\",\"userName\":\"zhangsan1\",\"groupNo\":\"2\",\"sortNum\":\"8\"}]";List<Map<String, Object>> list = (List<Map<String, Object>>) JSON.parse(jsonList);//定义一个要返回的新的ListList<Map<String, Object>> returnList = new ArrayList<>();Iterator iterator = list.iterator();Map<String, ArrayList<Map<String, Object>>> hashMap = new HashMap<>();while (iterator.hasNext()) {Map<String, Object> tmp = (Map<String, Object>) iterator.next();String groupNo = tmp.get("groupNo").toString();if (hashMap.containsKey(groupNo)) {ArrayList<Map<String, Object>> list2 = hashMap.get(groupNo);list2.add(tmp);} else {hashMap.put(groupNo, new ArrayList<>());ArrayList<Map<String, Object>> list1 = hashMap.get(groupNo);list1.add(tmp);}}//取出来key进行排序List<String> keySet = new ArrayList<>(hashMap.keySet());Collections.sort(keySet);Iterator iterator1 = keySet.iterator();while (iterator1.hasNext()) {String groupNo = (String) iterator1.next();Map<String, Object> newMap = new HashMap<>();List<Map<String, Object>> list2 = hashMap.get(groupNo);Collections.sort(list2, (o1, o2) -> {if (Integer.valueOf(o1.get("sortNum").toString()) > Integer.valueOf(o2.get("sortNum").toString())) {return 1;} else if (Integer.valueOf(o1.get("sortNum").toString()) < Integer.valueOf(o2.get("sortNum").toString())) {return -1;} else {return 0;}});newMap.put("groupNo", groupNo);newMap.put("list", list2);returnList.add(newMap);}return returnList;}
方式三:使用TreeMap取出来分组再组内排序
/*** 方式三:使用TreeMap先分组排序,在组内排序*/public static List<Map<String, Object>> sortByGroupNo3() {String jsonList = "[{\"userId\":\"7\",\"userName\":\"neo1\",\"groupNo\":\"3\",\"sortNum\":\"2\"},{\"userId\":\"11\",\"userName\":\"leo08\",\"groupNo\":\"3\",\"sortNum\":\"1\"},{\"userId\":\"15\",\"userName\":\"zhangsan\",\"groupNo\":\"3\",\"sortNum\":\"8\"},{\"userId\":\"1\",\"userName\":\"neo\",\"groupNo\":\"1\",\"sortNum\":\"2\"},{\"userId\":\"2\",\"userName\":\"leo\",\"groupNo\":\"1\",\"sortNum\":\"8\"},{\"userId\":\"3\",\"userName\":\"zhangsan\",\"groupNo\":\"1\",\"sortNum\":\"3\"},{\"userId\":\"4\",\"userName\":\"neo1\",\"groupNo\":\"2\",\"sortNum\":\"6\"},{\"userId\":\"2\",\"userName\":\"leo08\",\"groupNo\":\"2\",\"sortNum\":\"2\"},{\"userId\":\"3\",\"userName\":\"zhangsan1\",\"groupNo\":\"2\",\"sortNum\":\"8\"}]";List<Map<String, Object>> list = (List<Map<String, Object>>) JSON.parse(jsonList);//这里使用treeMap的自动排序机制,对groupNo进行排序TreeMap<String, ArrayList<Map<String, Object>>> treeMap = new TreeMap<>();Iterator iterator = list.iterator();while (iterator.hasNext()) {Map<String, Object> tmp = (Map<String, Object>) iterator.next();String groupNo = tmp.get("groupNo").toString();if (treeMap.containsKey(groupNo)) {ArrayList<Map<String, Object>> list2 = treeMap.get(groupNo);list2.add(tmp);Collections.sort(list2, (o1, o2) -> {if (Integer.valueOf(o1.get("sortNum").toString()) > Integer.valueOf(o2.get("sortNum").toString())) {return 1;} else if (Integer.valueOf(o1.get("sortNum").toString()) < Integer.valueOf(o2.get("sortNum").toString())) {return -1;} else {return 0;}});} else {treeMap.put(groupNo, new ArrayList<Map<String, Object>>());ArrayList<Map<String, Object>> list1 = treeMap.get(groupNo);list1.add(tmp);}}//定义一个要返回的新的ListList<Map<String, Object>> returnList = new ArrayList<>();Iterator iter = treeMap.entrySet().iterator();while (iter.hasNext()) {Map<String, Object> newMap = new HashMap<>();Map.Entry<String, ArrayList<Map<String, Object>>> entry = (Map.Entry<String, ArrayList<Map<String, Object>>>) iter.next();String keyGroupNo = entry.getKey();newMap.put("groupNo", keyGroupNo);newMap.put("list", entry.getValue());returnList.add(newMap);}return returnList;}
测试代码及耗时
/*** 花费时间测试*/public static void costTime() {System.out.println("sortByGroupNo1排序结果:" + JSON.toJSONString(sortByGroupNo1()));System.out.println("sortByGroupNo2排序结果:" + JSON.toJSONString(sortByGroupNo2()));System.out.println("sortByGroupNo3排序结果:" + JSON.toJSONString(sortByGroupNo3()));int loopTimes = 100000;long startTime1 = System.currentTimeMillis();for (int i = 0; i < loopTimes; i++) {sortByGroupNo1();}System.out.println(loopTimes + "次循环,sortByGroupNo1耗时:" + (System.currentTimeMillis() - startTime1) + "ms");long startTime2 = System.currentTimeMillis();for (int i = 0; i < loopTimes; i++) {sortByGroupNo2();}System.out.println(loopTimes + "次循环,sortByGroupNo2耗时:" + (System.currentTimeMillis() - startTime2) + "ms");long startTime3 = System.currentTimeMillis();for (int i = 0; i < loopTimes; i++) {sortByGroupNo3();}System.out.println(loopTimes + "次循环,sortByGroupNo3耗时:" + (System.currentTimeMillis() - startTime3) + "ms");}
结果如下
sortByGroupNo1排序结果:[{"list":[{"sortNum":"2","userName":"neo","userId":"1","groupNo":"1"},{"sortNum":"3","userName":"zhangsan","userId":"3","groupNo":"1"},{"sortNum":"8","userName":"leo","userId":"2","groupNo":"1"}],"groupNo":"1"},{"list":[{"sortNum":"2","userName":"leo08","userId":"2","groupNo":"2"},{"sortNum":"6","userName":"neo1","userId":"4","groupNo":"2"},{"sortNum":"8","userName":"zhangsan1","userId":"3","groupNo":"2"}],"groupNo":"2"},{"list":[{"sortNum":"1","userName":"leo08","userId":"11","groupNo":"3"},{"sortNum":"2","userName":"neo1","userId":"7","groupNo":"3"},{"sortNum":"8","userName":"zhangsan","userId":"15","groupNo":"3"}],"groupNo":"3"}]
sortByGroupNo2排序结果:[{"list":[{"sortNum":"2","userName":"neo","userId":"1","groupNo":"1"},{"sortNum":"3","userName":"zhangsan","userId":"3","groupNo":"1"},{"sortNum":"8","userName":"leo","userId":"2","groupNo":"1"}],"groupNo":"1"},{"list":[{"sortNum":"2","userName":"leo08","userId":"2","groupNo":"2"},{"sortNum":"6","userName":"neo1","userId":"4","groupNo":"2"},{"sortNum":"8","userName":"zhangsan1","userId":"3","groupNo":"2"}],"groupNo":"2"},{"list":[{"sortNum":"1","userName":"leo08","userId":"11","groupNo":"3"},{"sortNum":"2","userName":"neo1","userId":"7","groupNo":"3"},{"sortNum":"8","userName":"zhangsan","userId":"15","groupNo":"3"}],"groupNo":"3"}]
sortByGroupNo3排序结果:[{"list":[{"sortNum":"2","userName":"neo","userId":"1","groupNo":"1"},{"sortNum":"3","userName":"zhangsan","userId":"3","groupNo":"1"},{"sortNum":"8","userName":"leo","userId":"2","groupNo":"1"}],"groupNo":"1"},{"list":[{"sortNum":"2","userName":"leo08","userId":"2","groupNo":"2"},{"sortNum":"6","userName":"neo1","userId":"4","groupNo":"2"},{"sortNum":"8","userName":"zhangsan1","userId":"3","groupNo":"2"}],"groupNo":"2"},{"list":[{"sortNum":"1","userName":"leo08","userId":"11","groupNo":"3"},{"sortNum":"2","userName":"neo1","userId":"7","groupNo":"3"},{"sortNum":"8","userName":"zhangsan","userId":"15","groupNo":"3"}],"groupNo":"3"}]
100000次循环,sortByGroupNo1耗时:3433ms
100000次循环,sortByGroupNo2耗时:1338ms
100000次循环,sortByGroupNo3耗时:992ms
Json数组列表中的数据分组排序、组内排序相关推荐
- matlab 日期排序_在Matlab中对数据进行排序(Sorting Data in Matlab)
在Matlab中对数据进行排序(Sorting Data in Matlab) 我试图在Matlab中对以下数据进行排序,但没有得到我需要的预期输出. 这是数据: '1B-3A-5A' '1A-3A- ...
- mysql 如何对表排序_学习MySQL:对表中的数据进行排序和过滤
mysql 如何对表排序 In this article, we will learn how we can sort and filter data using the WHERE clause a ...
- 对数据库中的数据进行排序
** 对数据库中的数据进行排序 ** 使用SELECT语句从表中查询数据时,不保证结果集中的行顺序.这意味着SQL Server可以返回具有未指定顺序的结果集. 保证结果集中的行已排序的方法是使用OR ...
- Python编程对列表中字典元素进行排序的方法详解
@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本文实例讲述了Python编程对列表中字典元素进行排序的方法.分享给大家供大家参考,具体如下: 内容目录: 问题起源 对列表中的字 ...
- 【JSON】java获取json数组格式中的值
[JSON]java获取json数组格式中的值 前情回顾 java获取json数组格式中的值 参考资料 前情回顾 写项目的中间需要解决下面这样问题: 1.从kafka中读取数据,读取出来的是json格 ...
- pandas使用query函数查询dataframe指定数据列的内容(数值)不包含在特定列表中的数据行(not contain in list)
pandas使用query函数查询dataframe指定数据列的内容(数值)不包含在特定列表中的数据行(select rows which column values are not containe ...
- pandas使用query函数查询dataframe指定数据列的内容(数值)包含在特定列表中的数据行(select rows which column values contain in list)
pandas使用query函数查询dataframe指定数据列的内容(数值)包含在特定列表中的数据行(select rows which column values contained in a li ...
- 如何向列表中添加数据值(管理员篇)
如何向列表中插入数据?这是一个很简单的问题.那么我的这两篇文章主要是对各种方法的总结,如果有朋友有不同的意见,请指正. 首先,我们来看一下列表(自定义列表,列表名称:Jobs). 列名 类型 注释 T ...
- android json mysql_Android通过json向MySQL中读写数据的方法详解【写入篇】
本文实例讲述了Android通过json向MySQL中写入数据的方法.,具体如下: 先说一下如何通过json将Android程序中的数据上传到MySQL中: 首先定义一个类JSONParser.Jav ...
最新文章
- 开发人员学Linux(10):CentOS7安装配置代码质量管理平台SonarQube6.4
- 软件架构设计(第2版)——程序员向架构师转型必备
- 【自动驾驶】29.坐标变换与坐标轴旋转
- 阿里云安全送您六道平安符,恭贺新春!
- IBM将利用Watson进行报税 以彰显人工智能优势
- Windows下的Qt Creator的安装
- anaconda下python中matplotlib画图无法显示中文
- oracle 频繁 tm tx,oracle频繁出现TX/TM锁问题
- ECSHOP商品描述和文章里不加水印,只在商品图片和商品相册加水印
- java list判断是否存在字符串_java怎么判断字符串是否存在于list集合中?
- suse linux 忘记root密码,SUSE linux 忘记root密码
- e1载波的数据速率是_基于宽带电力线载波通信的路由技术研究
- Transition 总结
- 无线wifi盒子用不用拉网线?
- 【问题解决】samba添加用户和密码时报错 Failed to add entry for user
- 中国期货市场风险回顾之三(海南棕榈油M506事件)
- 混淆利器proguard的用法
- 北京师范大学网络教育高级c 语言作业答案,北京师范大学网络教育教育心理学离线作业及答案...
- 无线服务器插电跳闸,家里的插座有一个一插电就跳闸,一插电就跳闸,没有短路,不知道怎么回事...
- ClearType通俗解释
热门文章
- SAP中采购订单状态与MRP的关系
- 企业管理软件能带来什么
- 90后超71%遗嘱涉及房产,00后立的什么?
- java实现图片对比功能_Java 照片对比功能的实现
- html 下标签,html标签下
- 10上wsl位置迁移_wsl的安装/升级笔记
- 软件管家公众号_软件安装管家:大学生最值得关注的公众号
- 下方向键_Bash使用$#x27;...#x27;来捕获方向键
- (Buuctf) [第五空间2019 决赛]PWN5 简单格式化字符串漏洞利用
- Python内置函数之随机函数