排序工具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);

使用场景为需要对比排序数字大小.或者按照名字等进行a-z排序的时候可以用到

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序算法基础 排序算法,是一种能将一串数据按照特定的排序方式进行排列的一种算法,一个排序算法的好坏,主要从时间复杂...
    jackyshan阅读 4,010评论 3 11
  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 816评论 0 3
  • 当我写下这个题目的时候,我知道,我又开始准备煲一碗浓浓的鸡汤,来营养各位,因为这一个月来,我经常写激励人的话,写诸...
    吃货不孤独阅读 529评论 0 0
  • 早睡养身,早起养心。 当做完一天的事,便可以心满意足的睡觉。 睡是前提,高质量的睡眠是关键。 今天正值2017年最...
    行动派愫墨cc阅读 53评论 0 0
  • 初识蔡徐坤,只觉得这个名字好土。我想,就像过去的吴亦凡,鹿之晗,华晨宇,李宇春,周杰伦一样,每过一段时间,就有那么...
    昕頔阅读 147评论 0 0