前言:该篇目的是对中文进行字典排序
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);
}
}