JAVA关于汉语拼音首字母排序

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值