package cn.edu.hbcf.common.utils;public class FirstLetterUtil {private static int BEGIN = 45217;private static int END = 63486;// 按照声母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。// i, u, v都不做声母, 自定规则跟随前面的字母private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈','哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌','塌', '挖', '昔', '压', '匝', };// 二十六个字母区间对应二十七个端点// GB2312码汉字区间十进制表示private static int[] table = new int[27];// 对应首字母区间表private static char[] initialtable = { 'a', 'b', 'c', 'd', 'e', 'f', 'g','h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't','t', 't', 'w', 'x', 'y', 'z', };// 初始化static {for (int i = 0; i < 26; i++) {table[i] = gbValue(chartable[i]);// 得到GB2312码的首字母区间端点表,十进制。
        }table[26] = END;// 区间表结尾
    }/*** 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法,思路如下:一个个字符读入、判断、输出*/public static String getFirstLetter(String sourceStr) {String result = "";String str = sourceStr.toLowerCase();int StrLength = str.length();int i;try {for (i = 0; i < StrLength; i++) {result += Char2Initial(str.charAt(i));}} catch (Exception e) {result = "";}return result;}/*** 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0'*/private static char Char2Initial(char ch) {// 对英文字母的处理:小写字母转换为大写,大写的直接返回if (ch >= 'a' && ch <= 'z') {return ch;}if (ch >= 'A' && ch <= 'Z') {return ch;}// 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内,// 若不是,则直接返回。// 若是,则在码表内的进行判断。int gb = gbValue(ch);// 汉字转换首字母if ((gb < BEGIN) || (gb > END))// 在码表区间之前,直接返回
        {return ch;}int i;for (i = 0; i < 26; i++) {// 判断匹配码表区间,匹配到就break,判断区间形如“[,)”if ((gb >= table[i]) && (gb < table[i + 1])) {break;}}if (gb == END) {// 补上GB2312区间最右端i = 25;}return initialtable[i]; // 在码表区间中,返回首字母
    }/*** 取出汉字的编码 cn 汉字*/private static int gbValue(char ch) {// 将一个汉字(GB2312)转换为十进制表示。String str = new String();str += ch;try {byte[] bytes = str.getBytes("GB2312");if (bytes.length < 2) {return 0;}return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);} catch (Exception e) {return 0;}}}

FirstLetterUtil相关推荐

  1. android 功能模块之通讯模块四

     Android通讯录开发之通讯录联系人搜索功能最新实现 2014年1月13日 之前的有两篇博客介绍了如何解决通讯录搜索功能的问题,那些方法都是从网上搜集,然后经过自己整理试验之后的,但在项目测试 ...

  2. Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  3. Android通讯录模糊匹配搜索实现(号码 首字母 简拼 全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  4. 关键字的首字母拼音和全拼搜索

    /*** @author ChineseSpelling* 所有全拼集合 汉字转拼音 使用工具类*/ public class ChineseSpelling {private static int[ ...

最新文章

  1. 2022-2028年中国纤维增强聚合物行业市场调查研究及发展前景规划报告
  2. Ubuntu + VirtualBox + windows xp互相访问
  3. html与文本文件区别,流文件与文本文件的区别
  4. 数据中心机房冷热通道优化设计经验谈
  5. 笔记-项目人力资源管理
  6. 如何解决mapstruct和lombok冲突问题
  7. Mschart应用。
  8. Matlab:数模12-聚类分析
  9. SQL中的内连接查询和外连接查询
  10. C++模板的类的展开
  11. SEO优化基础知识大全 SEO新手入门必备知识
  12. 微信好友只有昵称没有微信号_只知道昵称怎么查他的微信号
  13. 风险偏好情绪提振,欧元低位延续反弹
  14. postman中 form-data、x-www-form-urlencoded、raw、binary的区别
  15. 在Element UI中表格根据数据动态变化显示表格的内容
  16. 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)...
  17. 思路:controller层:后台如何取值 前端如何给name赋值 例如是id赋值还是自己随意定义...
  18. 6410同时支持colorkey和aphablend
  19. 3D云打印系统OctoPrint,中文化详细图文教程
  20. LDA主题模型的原理及使用教程

热门文章

  1. Windows如何安装MSMQ消息队列
  2. 子类能不能继承父类的构造方法?
  3. fedora20开机启动配置:systemctl
  4. [asp]统计在线人数情况
  5. java扫描指定package注解_java随笔-扫描使用指定注解的类与方法
  6. java返回两个string_java – 为什么String.intern()方法返回两个不同的结果?
  7. ARM(IMX6U)裸机之I.MX6ULL硬件启动方式的选择
  8. 手机技巧:是否应该一次性给手机充电到100%?看完你就明白了!
  9. Spring:Spring相关知识介绍笔记
  10. 为什么说嵌入式开发比单片机要难很多?