最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使用的时候,需要考虑多音字的不同排列组合,下面的代码就是支持多音字的.

pinyin4j官方网址:http://pinyin4j.sourceforge.net/

    1. import java.util.HashSet;
    2. import java.util.Set;
    3. import net.sourceforge.pinyin4j.PinyinHelper;
    4. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
    5. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
    6. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
    7. import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
    8. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
    9. public class pinyin4j {
    10. /**
    11. * 字符串集合转换字符串(逗号分隔)
    12. * @author wyh
    13. * @param stringSet
    14. * @return
    15. */
    16. public static String makeStringByStringSet(Set<String> stringSet){
    17. StringBuilder str = new StringBuilder();
    18. int i=0;
    19. for(String s : stringSet){
    20. if(i == stringSet.size() - 1){
    21. str.append(s);
    22. }else{
    23. str.append(s + ",");
    24. }
    25. i++;
    26. }
    27. return str.toString().toLowerCase();
    28. }
    29. /**
    30. * 获取拼音集合
    31. * @author wyh
    32. * @param src
    33. * @return Set<String>
    34. */
    35. public static Set<String> getPinyin(String src){
    36. if(src!=null && !src.trim().equalsIgnoreCase("")){
    37. char[] srcChar ;
    38. srcChar=src.toCharArray();
    39. //汉语拼音格式输出类
    40. HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();
    41. //输出设置,大小写,音标方式等
    42. hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
    43. hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE)
    44. hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
    45. String[][] temp = new String[src.length()][];
    46. for(int i=0;i<srcChar.length;i++){
    47. char c = srcChar[i];
    48. //是中文或者a-z或者A-Z转换拼音(我的需求,是保留中文或者a-z或者A-Z)
    49. if(String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")){
    50. try{
    51. temp[i] = PinyinHelper.toHanyuPinyinStringArray(srcChar[i], hanYuPinOutputFormat);
    52. }catch(BadHanyuPinyinOutputFormatCombination e) {
    53. e.printStackTrace();
    54. }
    55. }else if(((int)c>=65 && (int)c<=90) || ((int)c>=97 && (int)c<=122)){
    56. temp[i] = new String[]{String.valueOf(srcChar[i])};
    57. }else{
    58. temp[i] = new String[]{""};
    59. }
    60. }
    61. String[] pingyinArray = Exchange(temp);
    62. Set<String> pinyinSet = new HashSet<String>();
    63. for(int i=0;i<pingyinArray.length;i++){
    64. pinyinSet.add(pingyinArray[i]);
    65. }
    66. return pinyinSet;
    67. }
    68. return null;
    69. }
    70. /**
    71. * 递归
    72. * @author wyh
    73. * @param strJaggedArray
    74. * @return
    75. */
    76. public static String[] Exchange(String[][] strJaggedArray){
    77. String[][] temp = DoExchange(strJaggedArray);
    78. return temp[0];
    79. }
    80. /**
    81. * 递归
    82. * @author wyh
    83. * @param strJaggedArray
    84. * @return
    85. */
    86. private static String[][] DoExchange(String[][] strJaggedArray){
    87. int len = strJaggedArray.length;
    88. if(len >= 2){
    89. int len1 = strJaggedArray[0].length;
    90. int len2 = strJaggedArray[1].length;
    91. int newlen = len1*len2;
    92. String[] temp = new String[newlen];
    93. int Index = 0;
    94. for(int i=0;i<len1;i++){
    95. for(int j=0;j<len2;j++){
    96. temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j];
    97. Index ++;
    98. }
    99. }
    100. String[][] newArray = new String[len-1][];
    101. for(int i=2;i<len;i++){
    102. newArray[i-1] = strJaggedArray[i];
    103. }
    104. newArray[0] = temp;
    105. return DoExchange(newArray);
    106. }else{
    107. return strJaggedArray;
    108. }
    109. }
    110. /**
    111. * @param args
    112. */
    113. public static void main(String[] args) {
    114. String str = "单田芳";
    115. System.out.println(makeStringByStringSet(getPinyin(str)));
    116. }
    117. }
    118. 控制台输出:dantianfang,shantianfang,chantianfang

java开源类库pinyin4j的使用的更多相关文章

  1. 【转】java开源类库pinyin4j的使用

    最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使 ...

  2. Atitit java onvif 开源类库 getProfiles getStreamUri

    Atitit java onvif 开源类库 getProfiles getStreamUri 1. ONVIF Java Library by Milgo1 1.1. https://github. ...

  3. Java 的 JSON 开源类库选择比较(zz)

    在看了作者的介绍,然后我又到mvnrepository上去看了各个库的的使用数之后,发现只能在jackson和gson之间做选择. 以下是原文 有效选择七个关于Java的JSON开源类库 April  ...

  4. 浅谈 Java 主流开源类库解析 XML

    在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...

  5. 国人开源了一款小而全的 Java 工具类库,厉害啊!!

    最近栈长看到了一款小而全的 Java 工具类库:Hutool,Github 已经接近 14K Star 了,想必一定很优秀,现在推荐给大家,很多轮子不要再造了! Hutool 是什么 Hutool 是 ...

  6. Java开源中文分词类库

      IKAnalyzer  IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本.最初,它是以开 ...

  7. 一些iOS高效开源类库

    因为iOS SDK相对比较底层,所以开发者就得受累多做一些体力活.不过幸运的是,有很多第三方的类库可以用来简化很多不必要的工作.笔者整理了一下在本人学习过程中用到的一些比较有用Objective-C开 ...

  8. [转]C#常用开源类库收集

    .net PDF 类库 PDFsharp PDFsharp是一款可以让.NET框架支持的任何语言很容易的创建PDF文件的类库. ASP.NET FO PDF FO PDF 是一款C#编写类似于ASP. ...

  9. C#常用开源类库

    一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...

随机推荐

  1. TempData["a"]多个Action方法之前共享数据

    ViewData["a"]只可以在自己视图的页面里被访问,但TempData["a"]可以多个Action方法之前共享数据,比如在 @{Html.RenderA ...

  2. MQTT协议学习研究 & Mosquitto简要教程(安装和使用)

    若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...

  3. 深入hibernate的三种状态(转)

    hibernate的三种状态: 瞬时对象,持久化对象,托管对象. hibernate的两级缓存:1>一级缓存:session    2>二级缓存:sessionfactory. 瞬时对象: ...

  4. Vlock用于有多个用户访问控制台的共享 Linux 系统

    当你在共享的系统上工作时,你可能不希望其他用户偷窥你的控制台中看你在做什么.如果是这样,我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统. 要感谢Vlock(Vi ...

  5. Centos下安装git高版本2.1.2

    安装依赖软件 # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc # yum in ...

  6. 解决国内 NPM 安装依赖速度慢问题

    不知道各位是否遇到这种情况,使用NPM(Node.js包管理工具)安装依赖时速度特别慢,为了安装Express,执行命令后两个多小时都没安装成功,最后只能取消安装,笔者20M带宽,应该不是我网络的原因 ...

  7. codevs 1423 骑士 - Tarjan - 动态规划

    题目描述 Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵 ...

  8. 理解 python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  9. Delphi XE5 for Android (一)

    Delphi XE5 出来了,支持Android的开发,试用了一下,有几个问题: 1.只支持ARM7的设备,不支持Inter设备.手上刚好有一个华硕K004,很遗憾用不上,只能用手机试了. 2.要支持 ...

  10. 可持久化fhq-treap学习笔记

    目录 可持久化fhq-treap----- 支持查询历史版本的非旋treap 先看看为啥他可以可持久化 过程 别的 注意&&出错&&吐槽 模板->luoguP38 ...