文章目录

  • 问题描述
  • 方式一:先全部排序,在分组排序
  • 方式二:使用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数组列表中的数据分组排序、组内排序相关推荐

  1. matlab 日期排序_在Matlab中对数据进行排序(Sorting Data in Matlab)

    在Matlab中对数据进行排序(Sorting Data in Matlab) 我试图在Matlab中对以下数据进行排序,但没有得到我需要的预期输出. 这是数据: '1B-3A-5A' '1A-3A- ...

  2. mysql 如何对表排序_学习MySQL:对表中的数据进行排序和过滤

    mysql 如何对表排序 In this article, we will learn how we can sort and filter data using the WHERE clause a ...

  3. 对数据库中的数据进行排序

    ** 对数据库中的数据进行排序 ** 使用SELECT语句从表中查询数据时,不保证结果集中的行顺序.这意味着SQL Server可以返回具有未指定顺序的结果集. 保证结果集中的行已排序的方法是使用OR ...

  4. Python编程对列表中字典元素进行排序的方法详解

    @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本文实例讲述了Python编程对列表中字典元素进行排序的方法.分享给大家供大家参考,具体如下: 内容目录: 问题起源 对列表中的字 ...

  5. 【JSON】java获取json数组格式中的值

    [JSON]java获取json数组格式中的值 前情回顾 java获取json数组格式中的值 参考资料 前情回顾 写项目的中间需要解决下面这样问题: 1.从kafka中读取数据,读取出来的是json格 ...

  6. pandas使用query函数查询dataframe指定数据列的内容(数值)不包含在特定列表中的数据行(not contain in list)

    pandas使用query函数查询dataframe指定数据列的内容(数值)不包含在特定列表中的数据行(select rows which column values are not containe ...

  7. pandas使用query函数查询dataframe指定数据列的内容(数值)包含在特定列表中的数据行(select rows which column values contain in list)

    pandas使用query函数查询dataframe指定数据列的内容(数值)包含在特定列表中的数据行(select rows which column values contained in a li ...

  8. 如何向列表中添加数据值(管理员篇)

    如何向列表中插入数据?这是一个很简单的问题.那么我的这两篇文章主要是对各种方法的总结,如果有朋友有不同的意见,请指正. 首先,我们来看一下列表(自定义列表,列表名称:Jobs). 列名 类型 注释 T ...

  9. android json mysql_Android通过json向MySQL中读写数据的方法详解【写入篇】

    本文实例讲述了Android通过json向MySQL中写入数据的方法.,具体如下: 先说一下如何通过json将Android程序中的数据上传到MySQL中: 首先定义一个类JSONParser.Jav ...

最新文章

  1. 开发人员学Linux(10):CentOS7安装配置代码质量管理平台SonarQube6.4
  2. 软件架构设计(第2版)——程序员向架构师转型必备
  3. 【自动驾驶】29.坐标变换与坐标轴旋转
  4. 阿里云安全送您六道平安符,恭贺新春!
  5. IBM将利用Watson进行报税 以彰显人工智能优势
  6. Windows下的Qt Creator的安装
  7. anaconda下python中matplotlib画图无法显示中文
  8. oracle 频繁 tm tx,oracle频繁出现TX/TM锁问题
  9. ECSHOP商品描述和文章里不加水印,只在商品图片和商品相册加水印
  10. java list判断是否存在字符串_java怎么判断字符串是否存在于list集合中?
  11. suse linux 忘记root密码,SUSE linux 忘记root密码
  12. e1载波的数据速率是_基于宽带电力线载波通信的路由技术研究
  13. Transition 总结
  14. 无线wifi盒子用不用拉网线?
  15. 【问题解决】samba添加用户和密码时报错 Failed to add entry for user
  16. 中国期货市场风险回顾之三(海南棕榈油M506事件)
  17. 混淆利器proguard的用法
  18. 北京师范大学网络教育高级c 语言作业答案,北京师范大学网络教育教育心理学离线作业及答案...
  19. 无线服务器插电跳闸,家里的插座有一个一插电就跳闸,一插电就跳闸,没有短路,不知道怎么回事...
  20. ClearType通俗解释

热门文章

  1. SAP中采购订单状态与MRP的关系
  2. 企业管理软件能带来什么
  3. 90后超71%遗嘱涉及房产,00后立的什么?
  4. java实现图片对比功能_Java 照片对比功能的实现
  5. html 下标签,html标签下
  6. 10上wsl位置迁移_wsl的安装/升级笔记
  7. 软件管家公众号_软件安装管家:大学生最值得关注的公众号
  8. 下方向键_Bash使用$#x27;...#x27;来捕获方向键
  9. (Buuctf) [第五空间2019 决赛]PWN5 简单格式化字符串漏洞利用
  10. Python内置函数之随机函数