Java關於list集合根據集合元素對象的某個或多個屬性進行排序的工具類

來源:互聯網
上載者:User

標籤:length   long   amp   max   訪問   .text   trace   final   null   

import java.lang.reflect.Field;import java.text.NumberFormat;import java.util.Collections;import java.util.Comparator;import java.util.Date;import java.util.List;public class ListUtils {    /**     * 對list的元素按照多個屬性名稱排序,     * list元素的屬性可以是數字(byte、short、int、long、float、double等,支援正數、負數、0)、char、String、java.util.Date     *      * @param lsit     * @param sortname     *            list元素的屬性名稱     * @param isAsc     *            true升序,false降序     */    public static <E> void sort(List<E> list, final boolean isAsc, final String... sortnameArr) {        Collections.sort(list, new Comparator<E>() {            public int compare(E a, E b) {                int ret = 0;                try {                    for (int i = 0; i < sortnameArr.length; i++) {                        ret = ListUtils.compareObject(sortnameArr[i], isAsc, a, b);                        if (0 != ret) {                            break;                        }                    }                } catch (Exception e) {                    e.printStackTrace();                }                return ret;            }        });    }    /**     * 給list的每個屬性都指定是升序還是降序     *      * @param list     * @param sortnameArr 參數數組     * @param typeArr 每個屬性對應的升降序數組, true升序,false降序     */    public static <E> void sort(List<E> list, final String[] sortnameArr, final boolean[] typeArr) {        if (sortnameArr.length != typeArr.length) {            throw new RuntimeException("屬性數組元素個數和升降序數組元素個數不相等");        }        Collections.sort(list, new Comparator<E>() {            public int compare(E a, E b) {                int ret = 0;                try {                    for (int i = 0; i < sortnameArr.length; i++) {                        ret = ListUtils.compareObject(sortnameArr[i], typeArr[i], a, b);                        if (0 != ret) {                            break;                        }                    }                } catch (Exception e) {                    e.printStackTrace();                }                return ret;            }        });    }    /**     * 對2個對象按照指定屬性名稱進行排序     *      * @param sortname     *            屬性名稱     * @param isAsc     *            true升序,false降序     * @param a     * @param b     * @return     * @throws Exception     */    private static <E> int compareObject(final String sortname, final boolean isAsc, E a, E b) throws Exception {        int ret;        Object value1 = ListUtils.forceGetFieldValue(a, sortname);        Object value2 = ListUtils.forceGetFieldValue(b, sortname);        String str1 = value1.toString();        String str2 = value2.toString();        if (value1 instanceof Number && value2 instanceof Number) {            int maxlen = Math.max(str1.length(), str2.length());            str1 = ListUtils.addZero2Str((Number) value1, maxlen);            str2 = ListUtils.addZero2Str((Number) value2, maxlen);        } else if (value1 instanceof Date && value2 instanceof Date) {            long time1 = ((Date) value1).getTime();            long time2 = ((Date) value2).getTime();            int maxlen = Long.toString(Math.max(time1, time2)).length();            str1 = ListUtils.addZero2Str(time1, maxlen);            str2 = ListUtils.addZero2Str(time2, maxlen);        }        if (isAsc) {            ret = str1.compareTo(str2);        } else {            ret = str2.compareTo(str1);        }        return ret;    }    /**     * 給數字對象按照指定長度在左側補0.     * 使用案例: addZero2Str(11,4) 返回 "0011", addZero2Str(-18,6)返回 "-000018"     *      * @param numObj     *            數字對象     * @param length     *            指定的長度     * @return     */    public static String addZero2Str(Number numObj, int length) {        NumberFormat nf = NumberFormat.getInstance();        // 設定是否使用分組        nf.setGroupingUsed(false);        // 設定最大整數位元        nf.setMaximumIntegerDigits(length);        // 設定最小整數位元        nf.setMinimumIntegerDigits(length);        return nf.format(numObj);    }    /**     * 擷取指定對象的指定屬性值(去除private,protected的限制)     *      * @param obj     *            屬性名稱所在的對象     * @param fieldName     *            屬性名稱     * @return     * @throws Exception     */    public static Object forceGetFieldValue(Object obj, String fieldName) throws Exception {        Field field = obj.getClass().getDeclaredField(fieldName);        Object object = null;        boolean accessible = field.isAccessible();        if (!accessible) {            // 如果是private,protected修飾的屬性,需要修改為可以訪問的            field.setAccessible(true);            object = field.get(obj);            // 還原private,protected屬性的訪問性質            field.setAccessible(accessible);            return object;        }        object = field.get(obj);        return object;    }}

Java關於list集合根據集合元素對象的某個或多個屬性進行排序的工具類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.