最近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. !! A股历史平均市盈率走势图

    http://value500.com/PE.asp 一. A股历史平均市盈率走势图 *数据来源:上海证券交易所 分享到: 354 - 上海A股 深圳A股更新时间 2017年6月7日 2017年6月7 ...

  2. js值类型和引用类型的区别

    1:赋值 值类型的赋值:直接将存储的数据赋值一份进行赋值,两份数据在内存中是完全独立的. 引用类型赋值:引用类型的赋值的时候,是将变量中的存储的地址赋值一份单独存储,但是两个变量中修改其中一个对象,另 ...

  3. zw版【转发·台湾nvp系列Delphi例程】HALCON HomMat2dRotate2

    zw版[转发·台湾nvp系列Delphi例程]HALCON HomMat2dRotate2 procedure TForm1.Button1Click(Sender: TObject);var op ...

  4. REST服务安全-双向认证

    1. 创建服务器密钥,其密钥库为 d:/mykeys/server.ks,注意keypass和storepass保持一致,它们分别代表 密钥密码和密钥库密码,注意 CN=localhost 中,loc ...

  5. linux基础命令---touch

    touch 将文件的访问时间和修改时间修改为当前时间.如果指定的文件不存在,那么将会创造空文件,除非指定-c或-h选项.文件参数字符串‘-‘被专门处理,并导致touch更改与标准输出相关联的文件的时间 ...

  6. 随意给一组数,找出满足一下条件的a[i],a[i]左边的数小于等于a[i],a[i]右边的数大于等于a[i]

    使用一个额外数组记录每个数后面的最小值是多少,一个额外数组记录一个数前面的最大值是多少,当然,为了减少空间复杂度,可以使用一个数字记录一个数字前面最大值是多少.算法如下: public List< ...

  7. Linux下实现 OpenSSL 简单加密与解密字符串

    场景 shell脚本中存在明文密码 客户要求禁止使用明文密码,密码做加密处理. 方案 在网上了解到了Linux OpenSSL加密解密工具 可以指定各种加密算法为字符,文件做加密处理. 加密的案例比较 ...

  8. SNMP学习笔记之SNMP TRAP简介、流程以及使用Python实现接受Trap信息

    0x00 SNMP TRAP简介 SNMP(Simple Network Management Protocol) trap是一种很有用,但是也容易让人难以理解的协议. 虽然名字叫做简单网络管理协议, ...

  9. Python Web学习笔记之WebSocket 通信过程与实现

    一.什么是 WebSocket ? WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输.但它跟 HTTP 没什么关系,它是基于 TCP 的一种独立实现. 以前客户端想知道服务 ...

  10. HTML 和 JavaScript 实现飘花的效果

    HTML 和 JavaScript 实现飘花的效果,也不算花,就是有悬浮物飘下来,和下雪似的. 也是不需要图片和其他的 js 脚本做辅助,其实已经全写在 HTML 文件中了. <html> ...