zoukankan      html  css  js  c++  java
  • 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
    }]

     

    .

  • 相关阅读:
    页面输入框限制
    异常处理:Sys.WebForms.PageRequestManagerParserErrorException:The message……
    几种常用网页文本编辑器总结
    C#委托和事件讲解
    ASP.NET内置对象详解
    string和stringBuilder区别
    Session和Cookie深度剖析
    破解版ps
    webpack
    JS设置cookie、读取cookie、删除cookie
  • 原文地址:https://www.cnblogs.com/jonban/p/10686477.html
Copyright © 2011-2022 走看看