前言:该篇目的是对中文进行字典排序

1.数据准备

// 创建数据
        List<String> stringList = Arrays.asList("李四", "阿毛", "张三", "小李", "小张");

2.使用常规的compareTo进行排序

/**
     * 1.使用常规的 compareTo进行比较
     * 说明:
     * 使用字符串排序得到的结果并没有按照中文字典排序,因为字符串的 compareTo() 方法是按照 ASCII
     * 码比较的,所以中文排序结果会是乱序。
     */
    @Test
    public void CompareToTest() {
        // 1.使用 compareTo进行排序
        List<String> collect1 = getData().stream().sorted(String::compareTo).collect(Collectors.toList());
        List<String> collect2 = getData().stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
        // 输出:[小张, 小李, 张三, 李四, 阿毛]
        System.out.println(collect1);
        System.out.println(collect2);
    }

输出:

[小张, 小李, 张三, 李四, 阿毛]
[小张, 小李, 张三, 李四, 阿毛]

说明:

使用字符串排序得到的结果并没有按照中文字典排序,因为字符串的 compareTo() 方法是按照 ASCII 码比较的,所以中文排序结果会是乱序。

3.使用Collator进行排序

/**
     *  2.使用 collator进行排序
     *  说明:
     *  Java JDK 中提供了一个专门处理不同自然语言搜索和排序的类:Collator。
     *  可以通过静态方法 getInstance() 和 Locale的静态变量来构建处理不同自然语言的类
     */
    @Test
    public void CollationKeyTest() {
        List<String> collect2 = getData().stream().sorted(
            Comparator.comparing(x -> Collator.getInstance(Locale.CHINA).getCollationKey(x))).collect(
            Collectors.toList());
        System.out.println(collect2);
    }

输出:

[阿毛, 李四, 小李, 小张, 张三]

说明:

1.Java JDK 中提供了一个专门处理不同自然语言搜索和排序的类:Collator;
2.可以通过静态方法 getInstance() 和 Locale的静态变量来构建处理不同自然语言的类;
3.CollationKey代表特定Collator对象规则下的String 。比较两个CollationKey会返回它们所代表的String的相对顺序。使用CollationKey比较String通常比使用Collator.compare更快。因此,当必须多次比较String时,例如在对String列表进行排序时。使用CollationKey更有效

#4.全部测试代码

/**
 * 对中文排序演示
 *
 * 1.使用 compareTo进行排序 {@link #CompareToTest()}
 * 2.使用 collator进行排序 {@link #CollationKeyTest()}
 *
 * @since 2022/05/17
 **/
public class SortChinese {

    @Test
    public List<String> getData() {
        // 创建数据
        return Arrays.asList("李四", "阿毛", "张三", "小李", "小张");
    }

    /**
     * 1.使用常规的 compareTo进行比较
     * 说明:
     * 使用字符串排序得到的结果并没有按照中文字典排序,因为字符串的 compareTo() 方法是按照 ASCII
     * 码比较的,所以中文排序结果会是乱序。
     */
    @Test
    public void CompareToTest() {
        // 1.使用 compareTo进行排序
        List<String> collect1 = getData().stream().sorted(String::compareTo).collect(Collectors.toList());
        List<String> collect2 = getData().stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
        // 输出:[小张, 小李, 张三, 李四, 阿毛]
        System.out.println(collect1);
        System.out.println(collect2);
    }

    /**
     * 2.使用 collator进行排序
     * 说明:
     * 1.Java JDK 中提供了一个专门处理不同自然语言搜索和排序的类:Collator;
     * 2.可以通过静态方法 getInstance() 和 Locale的静态变量来构建处理不同自然语言的类;
     * 3.CollationKey代表特定Collator对象规则下的String 。比较两个CollationKey会返回它们所代表的String的相对顺序。
     *   使用CollationKey比较String通常比使用Collator.compare更快。因此,当必须多次比较String时,例如在对String列表进行排序时。
     *   使用CollationKey更有效
     */
    @Test
    public void CollationKeyTest() {
        List<String> collect2 = getData().stream().sorted(
            Comparator.comparing(x -> Collator.getInstance(Locale.CHINA).getCollationKey(x))).collect(
            Collectors.toList());
        //[阿毛, 李四, 小李, 小张, 张三]
        System.out.println(collect2);
    }
}