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
}]

 

 

 

 

.

posted @ 2019-04-10 21:58  诚信天下  阅读(3073)  评论(0编辑  收藏  举报