1. 程式人生 > >Java 通用 List 中文排序方法

Java 通用 List 中文排序方法

Comparator 比較器可以對兩個雷進行比較,但是寫起來比較麻煩,不利於使用,可以寫一個公共的類,使用 apache commons包來實現。不過這種實現方式有一個問題,中文排序是按照 Unicode 字元碼來比較的,不是根據拼音,排序後近似亂序,效果不好。需要指定中文排序方式。

需要引入 apache-common 的 beanutils、collections

· 單個排序

    /**
     * List 陣列排序
     * @param <E>
     */
    @SuppressWarnings("unchecked")
    public
static <E> void sort(List<?> list, String key, String desc) { try { Comparator<?> comparator = new Comparator<E>() { @Override public int compare(E obj1, E obj2) { // 定義中文語境 Collator instance = Collator.getInstance(Locale.CHINA); return
instance.compare(obj1, obj2); } }; comparator = ComparatorUtils.nullLowComparator(comparator); if ("desc".equals(desc)) { comparator = ComparatorUtils.reversedComparator(comparator); } Collections.sort(list, new
BeanComparator(key, comparator)); } catch (Exception e) { Logger.exception(e); } }

· 組合排序


    /**
     * 組合排序
     */
    @SuppressWarnings("unchecked")
    public static <E> void sortMulti(List<?> list, String desc, String... keys) {
        try {
            Comparator<?> comparator = new Comparator<E>() {
                @Override
                public int compare(E obj1, E obj2) {
                    // 定義中文語境
                    Collator instance = Collator.getInstance(Locale.CHINA);
                    return instance.compare(obj1, obj2);
                }

            };
            comparator = ComparatorUtils.nullLowComparator(comparator);
            if ("desc".equals(desc)) {
                comparator = ComparatorUtils.reversedComparator(comparator);
            }

            // 建立一個排序鏈
            ComparatorChain<Object> multiSort = new ComparatorChain<>();
            for (String key : keys) {
                multiSort.addComparator(new BeanComparator(key, comparator)); // 批量新增排序規則
            }

            // 開始真正的排序,按照先新增先排序的規則
            Collections.sort(list, multiSort);
        } catch (Exception e) {
            Logger.exception(e);
        }
    }