1. package test;
  2. import net.sourceforge.pinyin4j.PinyinHelper;
  3. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
  4. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
  5. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
  6. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
  7. /**
  8. * @className:PinyingUtil.java
  9. * @classDescription:拼音操作工具类
  10. * @author:xiayingjie
  11. * @createTime: 2010 - 10 - 21
  12. */
  13. public class PinyinUtil {
  14. /**
  15. * 将字符串转换成拼音数组
  16. *
  17. * @param src
  18. * @return
  19. */
  20. public static String[] stringToPinyin(String src) {
  21. return stringToPinyin(src, false, null);
  22. }
  23. /**
  24. * 将字符串转换成拼音数组
  25. *
  26. * @param src
  27. * @return
  28. */
  29. public static String[] stringToPinyin(String src,String separator) {
  30. return stringToPinyin(src, true, separator);
  31. }
  32. /**
  33. * 将字符串转换成拼音数组
  34. *
  35. * @param src
  36. * @param isPolyphone
  37. *            是否查出多音字的所有拼音
  38. * @param separator
  39. *            多音字拼音之间的分隔符
  40. * @return
  41. */
  42. public static String[] stringToPinyin(String src, boolean isPolyphone,
  43. String separator) {
  44. // 判断字符串是否为空
  45. if ( "" .equals(src) || null == src) {
  46. return null;
  47. }
  48. char[] srcChar = src.toCharArray();
  49. int srcCount = srcChar.length;
  50. String[] srcStr = new String[srcCount];
  51. for (int i = 0 ; i < srcCount; i++) {
  52. srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator);
  53. }
  54. return srcStr;
  55. }
  56. /**
  57. * 将单个字符转换成拼音
  58. *
  59. * @param src
  60. * @return
  61. */
  62. public static String charToPinyin(char src, boolean isPolyphone,
  63. String separator) {
  64. // 创建汉语拼音处理类
  65. HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  66. // 输出设置,大小写,音标方式
  67. defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  68. defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  69. StringBuffer tempPinying = new StringBuffer();
  70. // 如果是中文
  71. if (src > 128 ) {
  72. try {
  73. // 转换得出结果
  74. String[] strs = PinyinHelper.toHanyuPinyinStringArray(src,
  75. defaultFormat);
  76. // 是否查出多音字,默认是查出多音字的第一个字符
  77. if (isPolyphone && null != separator) {
  78. for (int i = 0 ; i < strs.length; i++) {
  79. tempPinying.append(strs[i]);
  80. if (strs.length != (i + 1 )) {
  81. // 多音字之间用特殊符号间隔起来
  82. tempPinying.append(separator);
  83. }
  84. }
  85. } else {
  86. tempPinying.append(strs[ 0 ]);
  87. }
  88. } catch (BadHanyuPinyinOutputFormatCombination e) {
  89. e.printStackTrace();
  90. }
  91. } else {
  92. tempPinying.append(src);
  93. }
  94. return tempPinying.toString();
  95. }
  96. public static String hanziToPinyin(String hanzi){
  97. return hanziToPinyin(hanzi, " " );
  98. }
  99. /**
  100. * 将汉字转换成拼音
  101. * @param hanzi
  102. * @param separator
  103. * @return
  104. */
  105. @SuppressWarnings( "deprecation" )
  106. public static String hanziToPinyin(String hanzi,String separator){
  107. // 创建汉语拼音处理类
  108. HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  109. // 输出设置,大小写,音标方式
  110. defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  111. defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  112. String pinyingStr= "" ;
  113. try {
  114. pinyingStr=PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, separator);
  115. } catch (BadHanyuPinyinOutputFormatCombination e) {
  116. // TODO Auto-generated catch block
  117. e.printStackTrace();
  118. }
  119. return pinyingStr;
  120. }
  121. /**
  122. * 将字符串数组转换成字符串
  123. * @param str
  124. * @param separator 各个字符串之间的分隔符
  125. * @return
  126. */
  127. public static String stringArrayToString(String[] str, String separator) {
  128. StringBuffer sb = new StringBuffer();
  129. for (int i = 0 ; i < str.length; i++) {
  130. sb.append(str[i]);
  131. if (str.length != (i + 1 )) {
  132. sb.append(separator);
  133. }
  134. }
  135. return sb.toString();
  136. }
  137. /**
  138. * 简单的将各个字符数组之间连接起来
  139. * @param str
  140. * @return
  141. */
  142. public  static String stringArrayToString(String[] str){
  143. return stringArrayToString(str, "" );
  144. }
  145. /**
  146. * 将字符数组转换成字符串
  147. * @param str
  148. * @param separator 各个字符串之间的分隔符
  149. * @return
  150. */
  151. public static String charArrayToString(char[] ch, String separator) {
  152. StringBuffer sb = new StringBuffer();
  153. for (int i = 0 ; i < ch.length; i++) {
  154. sb.append(ch[i]);
  155. if (ch.length != (i + 1 )) {
  156. sb.append(separator);
  157. }
  158. }
  159. return sb.toString();
  160. }
  161. /**
  162. * 将字符数组转换成字符串
  163. * @param str
  164. * @return
  165. */
  166. public static String charArrayToString(char[] ch) {
  167. return charArrayToString(ch, " " );
  168. }
  169. /**
  170. * 取汉字的首字母
  171. * @param src
  172. * @param isCapital 是否是大写
  173. * @return
  174. */
  175. public static char[]  getHeadByChar(char src,boolean isCapital){
  176. //如果不是汉字直接返回
  177. if (src <= 128 ) {
  178. return new char[]{src};
  179. }
  180. //获取所有的拼音
  181. String []pinyingStr=PinyinHelper.toHanyuPinyinStringArray(src);
  182. //创建返回对象
  183. int polyphoneSize=pinyingStr.length;
  184. char [] headChars=new char[polyphoneSize];
  185. int i= 0 ;
  186. //截取首字符
  187. for(String s:pinyingStr){
  188. char headChar=s.charAt( 0 );
  189. //首字母是否大写,默认是小写
  190. if(isCapital){
  191. headChars[i]=Character.toUpperCase(headChar);
  192. }else{
  193. headChars[i]=headChar;
  194. }
  195. i++;
  196. }
  197. return headChars;
  198. }
  199. /**
  200. * 取汉字的首字母(默认是大写)
  201. * @param src
  202. * @return
  203. */
  204. public static char[]  getHeadByChar(char src){
  205. return getHeadByChar(src,true);
  206. }
  207. /**
  208. * 查找字符串首字母
  209. * @param src
  210. * @return
  211. */
  212. public  static String[] getHeadByString(String src){
  213. return getHeadByString( src, true);
  214. }
  215. /**
  216. * 查找字符串首字母
  217. * @param src
  218. * @param isCapital 是否大写
  219. * @return
  220. */
  221. public  static String[] getHeadByString(String src,boolean isCapital){
  222. return getHeadByString( src, isCapital,null);
  223. }
  224. /**
  225. * 查找字符串首字母
  226. * @param src
  227. * @param isCapital 是否大写
  228. * @param separator 分隔符
  229. * @return
  230. */
  231. public  static String[] getHeadByString(String src,boolean isCapital,String separator){
  232. char[]chars=src.toCharArray();
  233. String[] headString=new String[chars.length];
  234. int i= 0 ;
  235. for(char ch:chars){
  236. char[]chs=getHeadByChar(ch,isCapital);
  237. StringBuffer sb=new StringBuffer();
  238. if(null!=separator){
  239. int j= 1 ;
  240. for(char ch1:chs){
  241. sb.append(ch1);
  242. if(j!=chs.length){
  243. sb.append(separator);
  244. }
  245. j++;
  246. }
  247. }else{
  248. sb.append(chs[ 0 ]);
  249. }
  250. headString[i]=sb.toString();
  251. i++;
  252. }
  253. return headString;
  254. }
  255. public static void main(String[] args) {
  256. System.out.println(PinyinUtil.stringArrayToString(getHeadByString( "我的心肝爱上" ), "-" ));
  257. }
  258. }

上面这个pinyinUtil类是pinyin4j包中的一个工具类,有多种方法供大家使用。

User类,相信不用再贴出来了,大家懂的。。。

下面这个类是实现排序的类了。

  1. package test;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.List;
  6. public class HanZiSort {
  7. public static void main(String[] args) {
  8. List<User> list= new ArrayList<User>();
  9. User u= new User();
  10. u.setName( "张三" );
  11. u.setAge( 21 );
  12. list.add(u);
  13. u= new User();
  14. u.setName( "李四" );
  15. u.setAge( 18 );
  16. list.add(u);
  17. u= new User();
  18. u.setName( "王五" );
  19. u.setAge( 25 );
  20. list.add(u);
  21. u= new User();
  22. u.setName( "寒子" );
  23. u.setAge( 89 );
  24. list.add(u);
  25. for (User user: list) {
  26. System.out.println(PinyinUtil.hanziToPinyin(user.getName()));
  27. }
  28. Collections.sort(list, new ToSort()); //new ToSort() 根据需求定义排序
  29. System.out.println( "排序后!!!!!!!!!" );
  30. for (User user: list) {
  31. System.out.println(PinyinUtil.hanziToPinyin(user.getName()));
  32. }
  33. }
  34. }
  35. //排序
  36. class ToSort implements Comparator<User> {
  37. @Override
  38. public int compare(User o1, User o2) {
  39. // TODO Auto-generated method stub
  40. String s1=PinyinUtil.hanziToPinyin(o1.getName());
  41. String s2=PinyinUtil.hanziToPinyin(o2.getName());
  42. if (s1.compareTo(s2)> 0 ) {
  43. return 1 ;
  44. } else {
  45. return - 1 ;
  46. }
  47. }
  48. }
Java代码
  1. zhang san
  2. li si
  3. wang wu
  4. han zi
  5. 排序后!!!!!!!!!
  6. han zi
  7. li si
  8. wang wu
  9. zhang san
Pinyin4j中的pinyinutil类代码  package test;    import net.sourceforge.pinyin4j.PinyinHelper;  import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;  import net.sourceforge.pinyin4j.fo
如下比较器实现了 汉字 按照字母顺序进行 排序 ,输入字符为英文字符将会排在 汉字 之前。可将待 排序 的DevelopmentGuideFolder放在list中,然后使用Collections.sort(list, new ZhongWenComparator());进行 排序 。 /** * 汉字 比较器. */ public static class ZhongWenComparator imple...
SELECT DISTINCT province_name, province_code FROM `metadata_township` ORDER BY convert(province_name USING gbk) asc 一般的 排序 都是能正确的,但是有的多音字啥的会有点差别,例如重庆,按理说是重是“chong”,但是 排序 的时候会按照“zhong”,就会排在靠后的。 Java 中按照 拼音 排序 我的list里面是对象,对象里面含有需要按照 拼音 排序 的字段name,我用 一,就是在用 java 代码处理在这里插入代码片 要实现 汉字 按首字母 排序 ,主要是设置语言环境,如下语句设置语言环境: 这里用到了Collator类,此类实现了Comparator接口,用他的getInstance就可以用指定的语言环境来构造一个Collator对象: 然后用如下语句创建Comparator: Comparator<Object> c...
Java 本身并没有提供 汉字 拼音 排序 的功能。但是,我们可以使用第三方库或者自己实现算法来解决这个问题。 下面是使用开源库" Pinyin 4j"实现 汉字 拼音 排序 的示例代码: import net.sourceforge. pinyin 4j. Pinyin Helper; import net.sourceforge. pinyin 4j.format.Hanyu Pinyin CaseType; import...
比较简单的问题,可以用Collections.sort()来进行 排序 一般情况下我们会这样做; private static final List<TestEntity> testEntities = new ArrayList<TestEntity>(); static { testEntities.add(new TestEntity("李循环", 12));
默认的 Collection.sort() 是按照 ASCII 码 排序 , 不过, 有第二个重载方法, 第二个参数可以传入 Comparator 对象 java .text.Collator 可以用于本地语言 排序 , 自身已经实现 Comparator 接口.Collator.getInstance(Locale.CHINA) 获取到我们中文的 Collator 实例 * 按照 拼音 首字母 排序 @Test public void test() { List<String> .
参考资料: https://www.cnblogs.com/zhangqie/p/9456401.html https://blog.csdn.net/weixin_42311000/article/details/114711578 结合以上的2个帖子进行了改进,得到的结果如下: (1)依赖的jar: <dependency> <groupId>com.belerweb</groupId> <artifactId&g
public static String to Pinyin (String hanzi) { StringBuilder sb = new StringBuilder(); for (char c : hanzi.toCharArray()) { String[] pinyin Array = Pinyin Helper.toHanyu Pinyin StringArray(c); if ( pinyin Array != null && pinyin Array.length > 0) { sb.append( pinyin Array[0]); } else { sb.append(c); return sb.toString(); 使用HanLP进行 汉字 拼音 : 1.首先需要下载HanLP的jar包,并将其导入项目中。 2.使用以下代码实现 汉字 拼音 : import com.hankcs.hanlp.HanLP; public class Pinyin Util { * 将 汉字 换为 拼音 * @param hanzi 汉字 字符串 * @return 拼音 字符串 public static String to Pinyin (String hanzi) { return HanLP.convertTo Pinyin String(hanzi, "", false); 其中,第三个参数表示是否保留 拼音 之间的空格。如果为true,则会保留空格;如果为false,则会去掉空格。