依赖jar

        <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>

新版排序算法,使用Lambda表达式(推荐)

JsonUtils.java

package javax.utils;

import java.util.Arrays;
import java.util.Collections;
import java.util.List; import com.alibaba.fastjson.JSONObject; /**
* JSONObject数组排序工具类
*
* @author Logan
* @version 1.0.0
* @createDate 2019-06-15
*
*/
public class JsonUtils { /**
* 按指定key排序JSONObject对象数组
*
* @param array JSONObject对象数组
* @param key 指定排序key
*/
public static void sort(JSONObject[] array, String key) {
Arrays.sort(array, (a, b) -> JsonUtils.compare(a, b, key));
} /**
* 按指定key排序JSONObject对象集合
*
* @param list JSONObject对象集合
* @param key 指定排序key
*/
public static void sort(List<JSONObject> list, String key) {
Collections.sort(list, (a, b) -> JsonUtils.compare(a, b, key));
} /**
* 按指定key降序排序JSONObject对象数组
*
* @param array JSONObject对象数组
* @param key 指定排序key
*/
public static void sortDesc(JSONObject[] array, String key) {
Arrays.sort(array, (a, b) -> -JsonUtils.compare(a, b, key));
} /**
* 按指定key降序排序JSONObject对象集合
*
* @param list JSONObject对象集合
* @param key 指定排序key
*/
public static void sortDesc(List<JSONObject> list, String key) {
Collections.sort(list, (a, b) -> -JsonUtils.compare(a, b, key));
} /**
* 按指定key比较两个JSONObject对象大小
*
* @param a 第一个JSONObject对象
* @param b 第二个JSONObject对象
* @param key 指定进行比较的key
* @return
* <ul>
* <li>如果a==b,返回0</li>
* <li>如果a>b,返回1</li>
* <li>如果a<b,返回-1</li>
* </ul>
*/
public static int compare(JSONObject a, JSONObject b, String key) {
Object va = a.get(key);
Object vb = b.get(key); if (null == va && null == vb) {
return 0;
} if (null == va) {
return -1;
} if (null == vb) {
return 1;
} if (va.equals(vb)) {
return 0;
} if (va instanceof Number && vb instanceof Number) { // 取double值比较,兼容整数
return Double.compare(a.getDoubleValue(key), b.getDoubleValue(key));
} // 忽略大小写字符串排序
return a.getString(key).compareToIgnoreCase(b.getString(key));
} }

旧版排序算法,适用于较低版本JDK

JsonUtils.java

package javax.utils;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import com.alibaba.fastjson.JSONObject; /**
*
* JSONObject数组排序工具类
*
* @author Logan
* @createDate 2019-04-10
* @version 1.0.0
*
*/
public class JsonUtils { /**
* 按指定key排序JSONObject对象数组
*
* @param array JSONObject对象数组
* @param key 指定排序key
*/
public static void sort(JSONObject[] array, String key) {
Arrays.sort(array, new Comparator<JSONObject>() { @Override
public int compare(JSONObject a, JSONObject b) {
return JsonUtils.compare(a, b, key);
}
});
} /**
* 按指定key排序JSONObject对象集合
*
* @param list JSONObject对象集合
* @param key 指定排序key
*/
public static void sort(List<JSONObject> list, String key) {
Collections.sort(list, new Comparator<JSONObject>() { @Override
public int compare(JSONObject a, JSONObject b) {
return JsonUtils.compare(a, b, key);
}
});
} /**
* 按指定key降序排序JSONObject对象数组
*
* @param array JSONObject对象数组
* @param key 指定排序key
*/
public static void sortDesc(JSONObject[] array, String key) {
Arrays.sort(array, new Comparator<JSONObject>() { @Override
public int compare(JSONObject a, JSONObject b) {
return -1 * JsonUtils.compare(a, b, key);
}
});
} /**
* 按指定key降序排序JSONObject对象集合
*
* @param list JSONObject对象集合
* @param key 指定排序key
*/
public static void sortDesc(List<JSONObject> list, String key) {
Collections.sort(list, new Comparator<JSONObject>() { @Override
public int compare(JSONObject a, JSONObject b) {
return -1 * JsonUtils.compare(a, b, key);
}
});
} /**
* 按指定key比较两个JSONObject对象大小
*
* @param a 第一个JSONObject对象
* @param b 第二个JSONObject对象
* @param key 指定进行比较的key
* @return
* <ul>
* <li>如果a==b,返回0</li>
* <li>如果a>b,返回1</li>
* <li>如果a<b,返回-1</li>
* </ul>
*/
public static int compare(JSONObject a, JSONObject b, String key) {
Object va = a.get(key);
Object vb = b.get(key); if (null == va && null == vb) {
return 0;
} if (null == va) {
return -1;
} if (null == vb) {
return 1;
} if (va.equals(vb)) {
return 0;
} if (va instanceof Number && vb instanceof Number) { /* 取double值相减,兼容整数 */
if (a.getDoubleValue(key) - b.getDoubleValue(key) > 0) {
return 1;
} else {
return -1;
}
} return a.getString(key).compareToIgnoreCase(b.getString(key));
} }

以下是测试程序

JsonTest.java

package com.java.test;

import java.io.File;
import java.net.URL;
import java.util.List; import javax.utils.JsonUtils; import org.apache.commons.io.FileUtils;
import org.junit.Test; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; /**
* @author Logan
* @createDate 2019-04-10
* @version 1.0.0
*
*/
public class JsonTest { private static final String encoding = "UTF-8"; @Test
public void sort() {
try {
URL resource = JsonTest.class.getResource("/JsonText.txt");
String text = FileUtils.readFileToString(new File(resource.getFile()), encoding); String key = "birthday"; List<JSONObject> list = JSON.parseArray(text, JSONObject.class);
System.out.println(JSON.toJSONString(list, true));
System.out.println(); JsonUtils.sort(list, key);
System.out.println(JSON.toJSONString(list, true));
System.out.println(); JsonUtils.sortDesc(list, key);
System.out.println(JSON.toJSONString(list, true));
System.out.println(); System.out.println("-------------------------------------------");
JSONArray jsonArray = JSON.parseArray(text);
JSONObject[] array = jsonArray.toArray(new JSONObject[jsonArray.size()]);
System.out.println(JSON.toJSONString(array, true));
System.out.println(); JsonUtils.sort(array, key);
System.out.println(JSON.toJSONString(array, true));
System.out.println(); JsonUtils.sortDesc(array, key);
System.out.println(JSON.toJSONString(array, true));
System.out.println();
System.out.println("-------------------------------------------"); } catch (Exception e) {
e.printStackTrace();
}
}
}

JsonText.txt

[{
"birthday":"2000-12-21",
"number":"10003",
"name":"Hello",
"weight":120.5,
"age":16
},{
"birthday":"1998-12-21",
"number":"10002",
"name":"Hi",
"weight":150.5,
"age":18
},{
"birthday":"2006-12-21",
"number":"10005",
"name":"Good",
"weight":130.5,
"age":10
}]

.

JSONObject数组排序工具类的更多相关文章

  1. java操作excel 工具类

    java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...

  2. [转]java中JSONObject与JSONArray的使用详细说明及有关JSON的工具类

    JSONObject与JSONArray的使用 一.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: 1.commons-lang.jar 2.c ...

  3. Arrays -数组工具类,数组转化字符串,数组排序等

    package cn.learn.basic; import java.util.Arrays; /* java.util.Arrays是一个与数组相关的工具类,含有大量静态方法,用来实现数组常见的操 ...

  4. java工具类

    1.HttpUtilsHttp网络工具类,主要包括httpGet.httpPost以及http参数相关方法,以httpGet为例:static HttpResponse httpGet(HttpReq ...

  5. Android开发常用工具类

    来源于http://www.open-open.com/lib/view/open1416535785398.html 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前 ...

  6. HttpClient 4.5.x 工具类设计与实现

    最近,业务需要在java服务端发起http请求,需要实现"GET","POST","PUT"等基本方法.于是想以 "HttpCli ...

  7. Redis在JAVA中的运用(工具类)

    最近项目需要用redis在中间做缓存所以写了一个工具类作为练习用 redis版本:redis_version:3.0.504 用到阿里的解析JSON的库:fastjson import org.apa ...

  8. Json与javaBean之间的转换工具类

    /**  * Json与javaBean之间的转换工具类  *  * {@code 现使用json-lib组件实现  *    需要  *     json-lib-2.4-jdk15.jar  * ...

  9. 【java】:常用工具类

    PS; 平时用到的一些工具类,验证非空.字符切割.时间转换.金额转换 package com.jws.common.util; import java.io.UnsupportedEncodingEx ...

随机推荐

  1. JS 打乱数组顺序

    function rand(arr) { var len = arr.length //首先从最大的数开始遍历,之后递减 for(var i = arr.length - 1; i >= 0; ...

  2. VMware 无法连接虚拟设备ide1:0,主机上没有相对应的设备,您 要在每次开启此虚拟机时都尝试连接此虚拟设备吗?

    无法连接虚拟设备ide1:0,主机上没有相对应的设备,您 要在每次开启此虚拟机时都尝试连接此虚拟设备吗? 运行VMware,出现以上错误. ide1:0一般是虚拟机的光驱,配置默认选项是“使用物理驱动 ...

  3. Dev Express Report 学习总结(二)关于如何使用Grouping分组

    对于所有的报表工具来说,基本上所有Grouping功能的都很相似.正如前面说到的,Group处于Page Header和Page Footer之间,同时又将Detail包括与其中. 下面还是通过一个例 ...

  4. 关系型数据库---MySQL---事务

    1.概述 1.1 事务:在对业务相关的一系列数据进行操作时,需要保证数据操作的完整性(要么全部成功.要么全部失败): 1.2 MySQL中支持事务的存储引擎是:Innodb: 1.3 事务用来管理in ...

  5. Mybatis学习笔记3 - 增删改查示例

    1.接口定义 package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapper { ...

  6. Ubuntu 16.04下安装Charles抓包工具

    Charles是一个跨平台的抓包工具,虽然没有Fiddler做的这么完美,但是也算是另一个选择. 下载: https://www.charlesproxy.com/download/ 注册: http ...

  7. VB.NET中的模块

    在C#中有“静态类”的概念,自然里边全部的方法都是静态的.这意味着你可以直接通过"类名.方法名"去调用(例如System的Math类就是典型).在VB.NET中,没有“静态类”的概 ...

  8. Ubuntu环境下安装Bochs

    首先说一下我的Ubuntu版本,敲命令 sudo lsb_release -a 就可以看到 No LSB modules are available. Distributor ID: Ubuntu D ...

  9. 安全漏洞 : XSS CSRF

    https://my.oschina.net/hc24/blog/527099 XSS成因概括 : XSS其实就是Html的注入问题,攻击者A的输入没有经过严格的控制进入了数据库,最终显示给来访的用户 ...

  10. 开启win7笔记本自带无线功能

    在cmd中输入以下命令: netsh wlan set hostednetwork mode=allow /disallow netsh wlan set hostednetwork ssid=Myw ...