Java 实现汉字按照首字母分组排序特殊字符换成#

接到一个需求,需要根据用户得名字把其分组一下,效果图如下请添加图片描述

我是后端,这我得写接口啊,搞得我头皮发麻,所以记录一下

返回的数据结构是这样的
在这里插入图片描述

操作步骤,

  1. 首先引入一个拼音包
	<!--拼音包-->
		<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
		<dependency>
			<groupId>com.belerweb</groupId>
			<artifactId>pinyin4j</artifactId>
			<version>2.5.0</version>
		</dependency>
  1. 定义一个前端规定得数据结构
@Data
public class SysPrivateClassVo {
    /**
     * 主键
     */
    private String type;

    private List<SysPrivateClass> letter;

}
  1. 编写业务代码
@Autowired
    private SysPrivateClassMapper sysPrivateClassMapper;

    /**
     * 根据上课教练ID和传过来的时间(yyyy-MM-dd)
     * 查询教练今天的课程以及今天的上课的学员
     *
     * @param sysPrivateClass
     * @return
     */
    @Override
    public  List<SysPrivateClassVo> getPrivateClasses(SysPrivateClass sysPrivateClass) {
        List<SysPrivateClass> privateClasses =  sysPrivateClassMapper.getPrivateClasses(sysPrivateClass);
        List<SysPrivateClassVo> map = screenManufacturer(privateClasses);
        return map;
    }

    /**
     * 获取汉字串拼音,英文字符不变
     */
    public static String getFullSpell(String chinese) {
        StringBuffer pybf = new StringBuffer();
        char[] arr = chinese.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > 128) {
                try {
                    pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            } else {
                pybf.append(arr[i]);
            }
        }
        return pybf.toString();
    }

    /**
     * 将集合数据按照汉字首字母分组排序
     */
    public static  List<SysPrivateClassVo> screenManufacturer(List<SysPrivateClass> list) {
        try {
            Collator com = Collator.getInstance(java.util.Locale.CHINA);
            // 按字母排序
            // 1 通过java 8 stream流进行处理
            Collection<String> strings = list.stream().map(SysPrivateClass::getCustomerName).sorted(Collator.getInstance(Locale.CHINA)).collect(Collectors.toList());
            //Collections.sort(list, com);
            // 输出26个字母
            List<SysPrivateClassVo> classVos = Collections.synchronizedList(new ArrayList<>());
            Map<String, Object> map = new TreeMap<>();
            for (int i = 0; i < 27; i++) {
                String word = String.valueOf((char)(96 + i)).toUpperCase();
                // 循环找出 首字母一样的数据
                List<SysPrivateClass> letter = Collections.synchronizedList(new ArrayList<>());
                Iterator<SysPrivateClass> ite = list.iterator();
                int count=0;
                while(ite.hasNext()){
                    SysPrivateClass str = ite.next();
                    String pybf = getFullSpell(str.getCustomerName());
                    String zm = pybf.substring(0, 1);
                    String pattern = "[A-Z]*";
                    boolean isMatch = Pattern.matches(pattern, zm);
                    if(!isMatch){
                        letter.add(str);
                        ite.remove();
                        SysPrivateClassVo  classVo = new SysPrivateClassVo();
                        classVo.setLetter(letter);
                        classVo.setType("#");
                        classVos.add(classVo);
                        count=1;
                    }
                    if (word.equals(zm)) {
                        letter.add(str);
                        count=0;
                    }
                }
                if(count==0){
                    SysPrivateClassVo  classVo = new SysPrivateClassVo();
                    classVo.setLetter(letter);
                    classVo.setType(word);
                    classVos.add(classVo);
                }

            }
            return classVos;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

如果发现博客有问题,欢迎各位老鸟指点一二

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现首字母排序可以使用拼音库,Java常用的拼音库有pinyin4j和tinyPinyin。 下面是使用pinyin4j实现首字母排序的示例代码: ```java import java.util.*; import net.sourceforge.pinyin4j.PinyinHelper; public class ChineseSorter { public static void main(String[] args) { String[] names = {"张三", "李四", "王五", "赵六", "陈七", "钱八"}; List<String> list = Arrays.asList(names); Collections.sort(list, new ChineseComparator()); System.out.println(list); } static class ChineseComparator implements Comparator<String> { @Override public int compare(String o1, String o2) { String[] pinyin1 = PinyinHelper.toHanyuPinyinStringArray(o1.charAt(0)); String[] pinyin2 = PinyinHelper.toHanyuPinyinStringArray(o2.charAt(0)); if (pinyin1 != null && pinyin2 != null) { int cmp = pinyin1[0].compareTo(pinyin2[0]); if (cmp == 0) { return o1.compareTo(o2); } else { return cmp; } } else { return o1.compareTo(o2); } } } } ``` 运行结果: ``` [陈七, 李四, 钱八, 张三, 赵六, 王五] ``` 这里使用了内部类实现了Comparator接口,实现compare方法来指定排序规则。在compare方法,首先将文转换为拼音数组,然后比较拼音数组的第一个拼音,如果相同就比较原始字符串,否则按照拼音排序。 需要注意的是,pinyin4j只能转换简体文,对于繁体文可能存在一些问题。如果需要支持繁体文,可以考虑使用其他拼音库,比如tinyPinyin。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Bug

谢谢老板,老板大气,老板硬邦邦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值