使用Java提供的 Collator 类比较.(不推荐)
- 原理: 用getInstance(Locale ) 方法进行实例化对象。然后重写里面的 compare() 的方法进行比较。
优点:排序方法实现简单.
缺点:排序结果不是很准确. - 例子:
String[] titles = {"关羽","张飞","公孙瓒","诸葛亮","曹操","刘备","赵云","微微", "哈哈", "哈", "怡情", "用友", "医院", "小米", "11", "2", "23", "234", "xiao", "at", "ok", "false"};
Comparator comparator = Collator.getInstance(java.util.Locale.CHINA);
Arrays.sort(titles,comparator);
for(String str:titles){
System.out.print(str +" ");
}
- 测试结果
使用pinyin4j比较.(推荐)
-
原理:重写Comparator接口,将中文转为拼音,然后进行比较.排序结果准确.
-
引入pinyin4j的jar包
<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
- 重写Comparator接口
public class PinyinComparator implements Comparator<Object> {
public int compare(Object o1, Object o2) {
char c1 = ((String) o1).charAt(0);
char c2 = ((String) o2).charAt(0);
return concatPinyinStringArray(
PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo(
concatPinyinStringArray(PinyinHelper
.toHanyuPinyinStringArray(c2)));
}
private String concatPinyinStringArray(String[] pinyinArray) {
StringBuffer pinyinSbf = new StringBuffer();
if ((pinyinArray != null) && (pinyinArray.length > 0)) {
for (int i = 0; i < pinyinArray.length; i++) {
pinyinSbf.append(pinyinArray[i]);
}
}
return pinyinSbf.toString();
}
public static void main(String[] args) {
String[] arr = {"关羽2", "关羽1", "张飞", "公孙瓒", "诸葛亮", "曹操", "刘备", "赵云", "微微", "哈哈", "哈", "怡情", "用友", "医院", "小米", "张三", "李四", "王五", "赵六", "JAVA", "java", "AVA", "php", "PHP", "123", "2", "234", "126", "011", "123", "$%$#", "哈哈A",
"1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情"};
List<String> list = Arrays.asList(arr);
Collections.sort(list, new PinyinComparator());
System.out.println(list);
}
}
- 测试结果
使用hutool工具类比较.(没试过)
- 原理:hutool中拼音工具-PinyinUtil的是对TinyPinyin、JPinyin、Pinyin4j三种的封装,原理应该是一样的。
- hutool API
拼音工具-pinyinutil - 使用
- 获取拼音
// "ni hao"
String pinyin = PinyinUtil.getPinyin("你好", " ");
- 获取拼音首字母
// "h, s, d, y, g"
String result = PinyinUtil.getFirstLetter("H是第一个", ", ");
- 自定义拼音库(拼音引擎)
Pinyin4jEngine engine = new Pinyin4jEngine();
// "ni hao h"
String pinyin = engine.getPinyin("你好h", " ");