通过TreeMap 和 冒泡算法对JSON 进行排序
排序实现所用依赖
主要使用的是阿里的fastjson。 commons-lang3 为工具类,里面包含String, 集合,日期等各种工具类
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.11</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.74</version></dependency>
排序实现逻辑
排序主要从两块入手,分别是JSONObject, JSONArray.
对JSONObject进行排序
对JSONObject排序,选择使用TreeMap, 因为TreeMap的底层继承实现了NavigableMap接口,保证了TreeMap的有序性,
排序规则采用的是Comparator.naturalOrder(),具体逻辑实现:
public static void sortJSONbyTreeMap(JSONObject payload){TreeMap<String, Object> treeMap = new TreeMap<>(Comparator.naturalOrder());for (Map.Entry<String, Object> entry : payload.entrySet()) {treeMap.put(entry.getKey(), entry.getValue());}for (Map.Entry<String, Object> entry : treeMap.entrySet()) {payload.remove(entry.getKey());payload.put(entry.getKey(), entry.getValue());}}
对JSONArray进行排序
排序算法选择的是冒泡排序,比较实现主要从三种类型考虑,分别为Comparable, JSONObject以及JSONArray.
当类型不同的数据比较时
采用Comparable > JSONObject > JSONArray的顺序进行排序,具体实现:
private final static ArrayList OBJ_TYPE_LIST = new ArrayList();static {OBJ_TYPE_LIST.add(Comparable.class.getSimpleName());OBJ_TYPE_LIST.add(JSONObject.class.getSimpleName());OBJ_TYPE_LIST.add(JSONArray.class.getSimpleName());}public static CompareResult compareObjectType(String objTypeA, String objTypeB) {Integer indexA = OBJ_TYPE_LIST.indexOf(objTypeA);Integer indexB = OBJ_TYPE_LIST.indexOf(objTypeB);if (indexA.compareTo(indexB) > 0) {return CompareResult.GREATER;} else if (indexA.compareTo(indexB) == 0) {return CompareResult.EQUAL;} else {return CompareResult.LESS;}}
当类型相同时,则分别使用不同的比较逻辑实现
1. 类型为Comparable的具体实现:
public static CompareResult compareObject(Object objA, Object objB) {String objTypeA = classifyObjectType(objA);String objTypeB = classifyObjectType(objB);CompareResult compareResult = compareObjectType(objTypeA, objTypeB);if (compareResult == CompareResult.EQUAL) {if (StringUtils.equals(objTypeA, JSONObject.class.getSimpleName())) {compareResult = compareJSONObject(((JSONObject) objA), ((JSONObject) objB));} else if (StringUtils.equals(objTypeA, JSONArray.class.getSimpleName())) {compareResult = compareJSONArray(((JSONArray) objA), ((JSONArray) objB));} else {if (((Comparable) objA).compareTo(objB) > 0) {compareResult = CompareResult.GREATER;} else if (((Comparable) objA).compareTo(objB) == 0) {compareResult = CompareResult.EQUAL;} else {compareResult = CompareResult.LESS;}}}return compareResult;}
2. 类型为JSONObject的具体实现:
public static CompareResult compareJSONObject(JSONObject jsonObjectA, JSONObject jsonObjectB) {CompareResult compareResult = CompareResult.LESS;if (jsonObjectA.size() > jsonObjectB.size()) {compareResult = CompareResult.GREATER;} else if (jsonObjectB.size() < jsonObjectB.size()) {compareResult = CompareResult.LESS;} else {//When jsonObjectB.size() == jsonObjectB.size()Iterator<Map.Entry<String, Object>> iteratorA = jsonObjectA.entrySet().iterator();Iterator<Map.Entry<String, Object>> iteratorB = jsonObjectB.entrySet().iterator();while (iteratorA.hasNext()) {Map.Entry<String, Object> entryA = iteratorA.next();Map.Entry<String, Object> entryB = iteratorB.next();//Compare keycompareResult = compareObject(entryA.getKey(), entryB.getKey());if (compareResult != CompareResult.EQUAL) {break;}//Compare the type of valuecompareResult = compareObjectType(classifyObjectType(entryA.getValue()), classifyObjectType(entryB.getValue()));if (compareResult != CompareResult.EQUAL) {break;}//Compare valuecompareResult = compareObject(entryA.getValue(), entryB.getValue());if (compareResult != CompareResult.EQUAL) {break;}}}return compareResult;}
3. 类型为JSONArray的具体实现:
public static CompareResult compareJSONArray(JSONArray jsonArrayA, JSONArray jsonArrayB) {CompareResult compareResult = CompareResult.LESS;if (jsonArrayA.size() > jsonArrayB.size()) {compareResult = CompareResult.GREATER;} else if (jsonArrayA.size() < jsonArrayB.size()) {compareResult = CompareResult.LESS;} else {//when jsonArrayA.size() == jsonArrayB.size()//Compare keycompareResult = compareObjectType(classifyObjectType(jsonArrayA.get(0)), classifyObjectType(jsonArrayB.get(0)));if (compareResult == CompareResult.EQUAL) {ListIterator<Object> listIteratorA = jsonArrayA.listIterator();ListIterator<Object> listIteratorB = jsonArrayB.listIterator();while (listIteratorA.hasNext()) {//Compare valuecompareResult = compareObject(listIteratorA.next(), listIteratorB.next());if (compareResult != CompareResult.EQUAL) {break;}}}}return compareResult;}
测试代码
@Testpublic void test(){String sample1 = "{\"aa\":\"1231\",\"waa\":\"3453\",\"err\":{\"123113\":{\"llll\":[5,1,3,2],\"rrrr\":\"12311df\",\"gdddf\":{\"vvsss\":[{\"qwrq\":\"222\",\"aaaa\":\"uuuu\"},{\"qwrq\":\"444\",\"aaaa\":\"342342\"},{\"qwrq\":\"234\",\"aaaa\":\"tttt\"}]}}},\"uuuu\":[{\"yyyy\":1231,\"iiiii\":\"uuuu\",\"9999\":{\"sssss\":\"ppppp\"}},{\"hjhj\":999,\"opop\":\"uuuu\"}]}";String sample2 = "{\"aa\":\"1231\",\"err\":{\"123113\":{\"llll\":[5,1,3,2],\"rrrr\":\"12311df\",\"gdddf\":{\"vvsss\":[,{\"qwrq\":\"234\",\"aaaa\":\"tttt\"},{\"qwrq\":\"222\",\"aaaa\":\"uuuu\"},{\"qwrq\":\"444\",\"aaaa\":\"342342\"}]}}},\"uuuu\":[{\"hjhj\":999,\"opop\":\"uuuu\"},{\"iiiii\":\"uuuu\",\"yyyy\":1231,\"9999\":{\"sssss\":\"ppppp\"}}],\"waa\":\"3453\"}";System.out.println("=====================================================");System.out.println(JSONSortUtil.sortJSONObject(JSON.parseObject(sample1)));System.out.println("=====================================================");System.out.println(JSONSortUtil.sortJSONObject(JSON.parseObject(sample2)));System.out.println("=====================================================");}
通过TreeMap 和 冒泡算法对JSON 进行排序相关推荐
- 排序算法之【打擂台算法】【冒泡算法】【选择排序】
目录 博文内容: 本讲讲解排序算法里三种基本算法以及它们之间的区别 ★博文转载请注明出处. 1. 打擂台算法: 实现步骤: 原理: 代码实现: 运行结果: 2. 冒泡算法实现排序: 冒泡法(也叫做起泡 ...
- 冒泡算法详解(AVA)
题目 使用冒泡算法对数组进行排序 输入 [6,1,2,7,9,3,4,5,10,8] 输出 [1,2,3,4,5,6,7,8,9,10] 解析 所谓的冒泡排序即每一次遍历都找到最大的一个数放到最后. ...
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现--转
TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...
- 冒泡算法的三种JavaScript表示
以前学习冒泡算法,总是弄不清楚n和n-1等一些变量的关系,原因是没有弄明白它的真正含义,今天写了一个冒泡算法的JS小程序,终于弄明白了. var R1=new Array(); R1[1]=35; R ...
- 冒泡算法代码java_java版本的冒泡算法
/** 文件名:MAOPao.java 描述: java版本的冒泡算法 作者:慈勤强 Email:cqq1978@Gmail.com **/ http://www.gaodaima.com/?p=42 ...
- python冒泡算法_python_冒泡算法
什么是冒泡算法? -- 像鱼吐泡泡一样,每次都是向上冒出一个水泡 如何逻辑整理? -- 先拿第一个值和剩下的值,一一比较,必能找到最大的或者最小的 -- 比较过程中,第一个值小于剩下的某个值,交换位置 ...
- python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...
算法可视化网站推荐---->visualgo 0.面试题中的排序算法 一些排序算法可能在工作中用的会比较少,但是面试却是不得不面对的问题.算法有助于提高我们对数据结构的理解以及提高自己的逻辑能力 ...
- php的冒泡算法,PHP实现冒泡算法
冒泡算法 function bubbleSort($ary){ $len = count($ary); for ($i=0; $i < $len - 1; $i++) { for ($j=0; ...
- C语言:使用冒泡算法将数组中的数据从大到小进行排序
/*使用冒泡算法将数组中的数据从大到小进行排序*/ #include<stdio.h> #define N 5 int main() {int a[N];int i,j,t;printf( ...
最新文章
- 关于Firefox在Win8下界面显示错乱的解决方法
- 字符串(一):char 数组
- 南开15计算机基础,南开大学计算机基础06-07_B卷
- PC机键盘的处理过程
- php 获取对象中的元素个数组长度,获取php类中的数组长度
- linux 修改文件名_Linux常用命令
- Netty是如何解决粘包和拆包问题的
- html行分割,如何确定一个html标签是否分割成多行
- C++文件操作初体验
- C#与OC交互方法中的ong参数的兼容性问题
- 解决 spring cloud git config 配置中心多环境问题
- 小说app开发功能及盈利方式
- 写作技巧~100段作文排比句(61-80段),考试一定用得上,赶紧收藏!
- 试用 必应bing 缤纷桌面
- matlab的shading,matlab colormap,caxis,shading,hsv,pcolor, alpha
- 嵌入式 Linux平台 C程序 交叉编译技术
- truffle填坑指南:truffle unbox react项目npm run start启动失败
- ENVI基于Landsat影像构建郑州市2000-2019年遥感生态指数RSEI
- /dev/sdb1: Not enough space to build proposed filesystem while setting up superblock
- 简单的golang游戏服务器框架《railgun》的文档目录索引