排序工具PinyinComparator

package XXXXXXXX;

import net.sourceforge.pinyin4j.PinyinHelper;

import java.util.Comparator;

public class PinyinComparator implements Comparator<String> {

    public int compare(String o1, String o2) {
        for (int i = 0; i < o1.length() && i < o2.length(); i++) {
            int codePoint1 = o1.charAt(i);
            int codePoint2 = o2.charAt(i);
            if (Character.isSupplementaryCodePoint(codePoint1)
                    || Character.isSupplementaryCodePoint(codePoint2)) {
                i++;
            }
            if (codePoint1 != codePoint2) {
                if (Character.isSupplementaryCodePoint(codePoint1)
                        || Character.isSupplementaryCodePoint(codePoint2)) {
                    return codePoint1 - codePoint2;
                }
                String pinyin1 = pinyin((char) codePoint1);
                String pinyin2 = pinyin((char) codePoint2);
                if (pinyin1 != null && pinyin2 != null) { // 兩個字符都是漢字
                    if (!pinyin1.equals(pinyin2)) {
                        return pinyin1.compareTo(pinyin2);
                    }
                } else {
                    return codePoint1 - codePoint2;
                }
            }
        }
        return o1.length() - o2.length();
    }


    /**
     * 字符的拼音,多音字就得到第一個拼音。不是漢字,就return null。
     */
    private String pinyin(char c) {
        String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
        if (pinyins == null) {
            return null;
        }
        return pinyins[0];
    }
}

使用方法


    /**
     * 默認降序
     */
    private void filedSort3(String fieldName, List<ListMaterialByEquipmentDTO> list) {
        switch (fieldName) {

            case "materialName":
                list.sort((ListMaterialByEquipmentDTO o1, ListMaterialByEquipmentDTO o2) -> new PinyinComparator().compare(o1.getMaterialName(), o2.getMaterialName()));
                break;
//            case "grade":
//                list.sort((arg0, arg1) -> (arg1.getGrade() == null ? BigDecimal.ZERO : arg1.getGrade()).compareTo(arg0.getGrade() == null ? BigDecimal.ZERO : arg0.getGrade()));
//                break;
            default:
                break;
        }
    }


調用
  List<ListMaterialByEquipmentDTO> typeList =Lists.newArraylist();
            filedSort3("materialName", typeList);

使用場景為需要對比排序數(shù)字大小.或者按照名字等進行a-z排序的時候可以用到

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 排序算法基礎 排序算法,是一種能將一串數(shù)據(jù)按照特定的排序方式進行排列的一種算法,一個排序算法的好壞,主要從時間復雜...
    jackyshan閱讀 4,306評論 3 11
  • --- layout: post title: "如果有人問你關系型數(shù)據(jù)庫的原理,叫他看這篇文章(轉)" date...
    藍墜星閱讀 919評論 0 3
  • 當我寫下這個題目的時候,我知道,我又開始準備煲一碗濃濃的雞湯,來營養(yǎng)各位,因為這一個月來,我經常寫激勵人的話,寫諸...
    吃貨不孤獨閱讀 586評論 0 0
  • 早睡養(yǎng)身,早起養(yǎng)心。 當做完一天的事,便可以心滿意足的睡覺。 睡是前提,高質量的睡眠是關鍵。 今天正值2017年最...
    行動派愫墨cc閱讀 69評論 0 0
  • 初識蔡徐坤,只覺得這個名字好土。我想,就像過去的吳亦凡,鹿之晗,華晨宇,李宇春,周杰倫一樣,每過一段時間,就有那么...
    昕頔閱讀 184評論 0 0

友情鏈接更多精彩內容