1 ) 引入pom
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
2 ) 创建工具类
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import java.util.*;
import java.text.Collator;
/**
* @program: emsp
* @description:
* @author: ldd
* @create: 2024-11-22 16:03
**/
public class ManufacturerComparator implements Comparator<String> {
private static final Collator englishCollator = Collator.getInstance(Locale.ENGLISH);
private static final Collator chineseCollator = Collator.getInstance(Locale.CHINESE);
@Override
public int compare(String s1, String s2) {
// 获取两个字符串的首字母(中文为拼音首字母,英文为字母首字母)
String firstLetter1 = getFirstLetter(s1);
String firstLetter2 = getFirstLetter(s2);
// 比较首字母
return chineseCollator.compare(firstLetter1, firstLetter2);
}
private String getFirstLetter(String str) {
// 判断字符串是否为中文
boolean isChinese = isChinese(str);
if (isChinese) {
// 获取中文拼音首字母
return getPinyinInitial(str.charAt(0));
} else {
// 获取英文首字母(假设字符串非空且至少有一个英文字母)
return str.substring(0, 1).toUpperCase(Locale.ENGLISH);
}
}
private boolean isChinese(String str) {
// 判断字符串是否包含中文字符
for (char c : str.toCharArray()) {
if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {
return true;
}
}
return false;
}
private String getPinyinInitial(char chineseChar) {
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
format.setVCharType(HanyuPinyinVCharType.WITH_V);
char[] pinyinArray = null;
try {
pinyinArray = PinyinHelper.toHanyuPinyinStringArray(chineseChar, format)[0].toCharArray();
} catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
throw new RuntimeException("将汉字转换为拼音时出错", badHanyuPinyinOutputFormatCombination);
}
// 返回拼音首字母
return String.valueOf(pinyinArray[0]);
}
}
3 ) 测试
public static void main(String[] args) {
List<String> manufacturers = new ArrayList<>();
manufacturers.add("apple");
manufacturers.add("beason");
manufacturers.add("华为");
manufacturers.add("samsung");
manufacturers.add("小米");
manufacturers.add("小李");
manufacturers.add("sony");
manufacturers.add("中兴");
//a h s z s z
Collections.sort(manufacturers, new ManufacturerComparator());
for (String manufacturer : manufacturers) {
System.out.println(manufacturer);
}
}
4 ) 结果
apple
beason
华为
samsung
sony
小米
小李
中兴
在这个实现中,getFirstLetter
方法负责获取字符串的首字母,对于中文字符串,它调用getPinyinInitial
方法来获取拼音首字母。然后,compare
方法使用chineseCollator
(虽然这里我们实际上是在比较字母和拼音,但使用中文的Collator
可以确保拼音按照中文排序规则进行比较,这对于处理拼音中的特殊字符(如ü)很重要)。
注意,由于我们假设输入的字符串至少包含一个有效的中文字符或英文字母来提取首字母,因此没有添加对空字符串或长度为零的字符串的检查。在实际应用中,您可能需要添加这些检查以避免StringIndexOutOfBoundsException
。