java获取汉字首字母,绝对靠谱。一眼开透代码原理,傻瓜看完也会自己写

项目需要一个获取汉字首字母,查阅了一个上午的资料,优化出下面代码。
本来是准备写一个功能性更强的,获取整个汉字拼音的,浪费太多时间,就不搞了,有时间再弄。话不多说,直接开撸:

package system.user.tool;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: zzjun
 * @date: 8/28/20 09:49
 * @description: 汉字转换成拼音
 */
public class HanZiConverterPinYin {

    public HanZiConverterPinYin() {
        // 初始化汉字拼音字母对照表
        initChinesePinyinComparisonMapList();
    }

    /**
     * 汉字拼音字母对照表
     * */
    private List<ChinesePinyinComparisonMap> chinesePinyinComparisonMapList;

    /**
     * 初始化汉字拼音字母对照表
     * */
    private void initChinesePinyinComparisonMapList(){
        chinesePinyinComparisonMapList = new ArrayList<ChinesePinyinComparisonMap>();

        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-20319,-20284,'A'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-20283,-19776,'B'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-19775,-19219,'C'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-19218,-18711,'D'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18710,-18527,'E'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18526,-18240,'F'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18239,-17923,'G'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-17922,-17418,'H'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-17417,-16475,'J'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-16474,-16213,'K'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-16212,-15641,'L'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-15640,-15166,'M'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-15165,-14923,'N'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14922,-14915,'O'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14914,-14631,'P'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14630,-14150,'Q'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14149,-14091,'R'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14090,-13319,'S'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-13318,-12839,'T'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-12838,-12557,'W'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-12556,-11848,'X'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-11847,-11056,'Y'));
        chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-11055,-10247,'Z'));
    }

    /**
     * 遍历获取首字母
     * */
    public char getPY(char c) throws Exception{
        byte[] bytes = String.valueOf(c).getBytes("GBK");

        //双字节汉字处理
        if(bytes.length==2){

            int hightByte = 256 + bytes[0];
            int lowByte = 256 + bytes[1];
            int asc = (256 * hightByte + lowByte) - 256 * 256;

            // 遍历转换
            for (ChinesePinyinComparisonMap map : this.chinesePinyinComparisonMapList){
                if(asc>=map.getSAscll() && asc<=map.getEAscll()){
                    return map.getCode();
                }
            }
        }

        // 单字节或其他直接输入,不执行编码
        return c;
    }

    /**
     * 获取汉字拼音
     * */
    public String getHanZiPY(String str){
        try{
            StringBuilder pyStrBd = new StringBuilder();

            for(char c : str.toCharArray()){
                pyStrBd.append(getPY(c));
            }

            return pyStrBd.toString();
        }catch(Exception e){
            e.printStackTrace();
        }

        return null;
    }


    /**
     * 汉字拼音字母对照类
     * */
    @Data
    @AllArgsConstructor
    private class ChinesePinyinComparisonMap{
        // 区间开头
        private int sAscll;

        // 区间结尾
        private int eAscll;

        // 对应字母
        private char code;
    }

    public static void main(String[] args) {
        HanZiConverterPinYin hanZiConverterPinYin = new HanZiConverterPinYin();
        String code = hanZiConverterPinYin.getHanZiPY("为了 配合 模糊 查询 很多 情况下 我们 需要 用到 汉字 首字母 进行 模糊 查询, 这样 的 例子 很多, 做法 也很多");
        System.out.println(code);
    }
}

直接调用main运行

public static void main(String[] args) {
    HanZiConverterPinYin hanZiConverterPinYin = new HanZiConverterPinYin();
    String code = hanZiConverterPinYin.getHanZiPY("为了 配合 模糊 查询 很多 情况下 我们 需要 用到 汉字 首字母 进行 模糊 查询, 这样 的 例子 很多, 做法 也很多");
    System.out.println(code);
}

输出结果:

 WL PH MH CX HD QKX WM XY YD HZ SZM JX MH CX, ZY D LZ HD, ZF YHD 

整个核心重点在这,其他的无非就是根据得到的ASCII,写个遍历,那个数据字典是网上找的,简单封装了一下。

// 双字节计算ASCII码
int hightByte = 256 + bytes[0];
int lowByte = 256 + bytes[1];
int asc = (256 * hightByte + lowByte) - 256 * 256;
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值