排序实现所用依赖

主要使用的是阿里的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进行排序

排序算法选择的是冒泡排序,比较实现主要从三种类型考虑,分别为ComparableJSONObject以及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. 排序算法之【打擂台算法】【冒泡算法】【选择排序】

    目录 博文内容: 本讲讲解排序算法里三种基本算法以及它们之间的区别 ★博文转载请注明出处. 1. 打擂台算法: 实现步骤: 原理: 代码实现: 运行结果: 2. 冒泡算法实现排序: 冒泡法(也叫做起泡 ...

  2. 冒泡算法详解(AVA)

    题目 使用冒泡算法对数组进行排序 输入 [6,1,2,7,9,3,4,5,10,8] 输出 [1,2,3,4,5,6,7,8,9,10] 解析 所谓的冒泡排序即每一次遍历都找到最大的一个数放到最后. ...

  3. 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现--转

    TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...

  4. 冒泡算法的三种JavaScript表示

    以前学习冒泡算法,总是弄不清楚n和n-1等一些变量的关系,原因是没有弄明白它的真正含义,今天写了一个冒泡算法的JS小程序,终于弄明白了. var R1=new Array(); R1[1]=35; R ...

  5. 冒泡算法代码java_java版本的冒泡算法

    /** 文件名:MAOPao.java 描述: java版本的冒泡算法 作者:慈勤强 Email:cqq1978@Gmail.com **/ http://www.gaodaima.com/?p=42 ...

  6. python冒泡算法_python_冒泡算法

    什么是冒泡算法? -- 像鱼吐泡泡一样,每次都是向上冒出一个水泡 如何逻辑整理? -- 先拿第一个值和剩下的值,一一比较,必能找到最大的或者最小的 -- 比较过程中,第一个值小于剩下的某个值,交换位置 ...

  7. python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...

    算法可视化网站推荐---->visualgo 0.面试题中的排序算法 一些排序算法可能在工作中用的会比较少,但是面试却是不得不面对的问题.算法有助于提高我们对数据结构的理解以及提高自己的逻辑能力 ...

  8. php的冒泡算法,PHP实现冒泡算法

    冒泡算法 function bubbleSort($ary){ $len = count($ary); for ($i=0; $i < $len - 1; $i++) { for ($j=0; ...

  9. C语言:使用冒泡算法将数组中的数据从大到小进行排序

    /*使用冒泡算法将数组中的数据从大到小进行排序*/ #include<stdio.h> #define N 5 int main() {int a[N];int i,j,t;printf( ...

最新文章

  1. 关于Firefox在Win8下界面显示错乱的解决方法
  2. 字符串(一):char 数组
  3. 南开15计算机基础,南开大学计算机基础06-07_B卷
  4. PC机键盘的处理过程
  5. php 获取对象中的元素个数组长度,获取php类中的数组长度
  6. linux 修改文件名_Linux常用命令
  7. Netty是如何解决粘包和拆包问题的
  8. html行分割,如何确定一个html标签是否分割成多行
  9. C++文件操作初体验
  10. C#与OC交互方法中的ong参数的兼容性问题
  11. 解决 spring cloud git config 配置中心多环境问题
  12. 小说app开发功能及盈利方式
  13. 写作技巧~100段作文排比句(61-80段),考试一定用得上,赶紧收藏!
  14. 试用 必应bing 缤纷桌面
  15. matlab的shading,matlab colormap,caxis,shading,hsv,pcolor, alpha
  16. 嵌入式 Linux平台 C程序 交叉编译技术
  17. truffle填坑指南:truffle unbox react项目npm run start启动失败
  18. ENVI基于Landsat影像构建郑州市2000-2019年遥感生态指数RSEI
  19. /dev/sdb1: Not enough space to build proposed filesystem while setting up superblock
  20. 简单的golang游戏服务器框架《railgun》的文档目录索引

热门文章

  1. ubuntu 环境 celery配置全解
  2. 【达内课程】PrintWriter
  3. 在Windows 10上观看DVD的两种简便方法
  4. UI视觉设计师工作流程上的总结与建议
  5. Java Web实习笔记
  6. 【数据库系统】函数依赖及其公理定理(1)
  7. css泡泡,CSS 气泡写法
  8. VB 调用动态链接库
  9. NDK开发_cwin配置+编程简单步骤
  10. 帮你强行杀死顽固不化的病毒进程