JSONObject数组排序工具类
依赖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数组排序工具类的更多相关文章
- java操作excel 工具类
java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...
- [转]java中JSONObject与JSONArray的使用详细说明及有关JSON的工具类
JSONObject与JSONArray的使用 一.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: 1.commons-lang.jar 2.c ...
- Arrays -数组工具类,数组转化字符串,数组排序等
package cn.learn.basic; import java.util.Arrays; /* java.util.Arrays是一个与数组相关的工具类,含有大量静态方法,用来实现数组常见的操 ...
- java工具类
1.HttpUtilsHttp网络工具类,主要包括httpGet.httpPost以及http参数相关方法,以httpGet为例:static HttpResponse httpGet(HttpReq ...
- Android开发常用工具类
来源于http://www.open-open.com/lib/view/open1416535785398.html 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前 ...
- HttpClient 4.5.x 工具类设计与实现
最近,业务需要在java服务端发起http请求,需要实现"GET","POST","PUT"等基本方法.于是想以 "HttpCli ...
- Redis在JAVA中的运用(工具类)
最近项目需要用redis在中间做缓存所以写了一个工具类作为练习用 redis版本:redis_version:3.0.504 用到阿里的解析JSON的库:fastjson import org.apa ...
- Json与javaBean之间的转换工具类
/** * Json与javaBean之间的转换工具类 * * {@code 现使用json-lib组件实现 * 需要 * json-lib-2.4-jdk15.jar * ...
- 【java】:常用工具类
PS; 平时用到的一些工具类,验证非空.字符切割.时间转换.金额转换 package com.jws.common.util; import java.io.UnsupportedEncodingEx ...
随机推荐
- 29-----BBS论坛
BBS论坛(二十九) 29.帖子详情页布局 (1)front/hooks.py @bp.errorhandler def page_not_found(): return render_templat ...
- SQL Server Reporting Service(SSRS) 第五篇 自定义数据处理扩展DPE(Data Processing Extension)
最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...
- JavaSE---线程同步
1.当多个线程同时访问同一个数据时,容易出现线程安全问题,必须进行线程同步: 2.解决方案: 1.1 Java的多线程引入了 同步监视器 ,使用同步监视器的通用方法就是 同步代码块 //线程开始 ...
- Murano Weekly Meeting 2015.09.22
Meeting time: 2015.September.22th 1:00~2:00 Chairperson: Serg Melikyan, PTL from Mirantis Meeting s ...
- 明码(C++)
2.明码(结果填空) (满分7分) 注意事项:问题的描述在考生文件夹下对应题号的“题目.txt”中.相关的参考文件在同一目录中.请先阅读题目,不限解决问题的方式,只要求提交结果.必须通过浏览器提交答案 ...
- DEDE图集手工上传图片,加入水印
DEDE的图集手工上传图片,是一个非常好用的flash上传图片工具.但是如果我们希望上传的图片,带有自己网站指定的水印,却发现没有达到我们的要求--那么如果我们确实希望上传的图片,带有水印,怎么办?以 ...
- GitKraken使用教程-基础部分(5)
7. 提交代码 1) 查看文件改动 修改了某个文件后,在程序右侧会出现已修改文件的列表(如图 1‑1),这里以Test.git 为例,修改了19264.h 的文件编码,将其改为utf8.Unstage ...
- POJ 3660—— Cow Contest——————【Floyd传递闭包】
Cow Contest Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- wpf 查找父元素、子元素方法
1 /// <summary> 2 /// 根据类型查找子元素 3 /// </summary> 4 /// <typeparam name="T"& ...
- [LeetCode]17. Letter Combinations of a Phone Number电话号码的字母组合
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that th ...