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

文章描述了一位后端开发者接到的需求,需要根据用户的名字首字母进行分组。他们使用了pinyin4j库来获取汉字的拼音,然后利用Java的Collator进行排序,通过Stream处理数据,最后将结果组织成指定的数据结构返回给前端。

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

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

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

操作步骤,

  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;
    }

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hello Bug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值