Java编程实现中英混合字符串数组按首字母排序的方法

在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如:

?
1
2
3
4
5
6
7
String[] arrays = new String[] { "gyu" , "sdf" , "zf" , "大同" , "收到" , "地方" , "三等分" , "的人" , "反对高铁" , "泛代数" , "上的投入" , "和国家" };
/*设置语言环境*/
Comparator com = Collator.getInstance(java.util.Locale.CHINA);
Arrays.sort(arrays, com);
for (String item:arrays) {
  System.out.print(item+ " " );
}

输出的结果为:“gyu  sdf  zf  大同  的人  地方  反对高铁  泛代数  和国家  三等分  上的投入  收到”;在Java中排列的顺序是按照数字->英文->汉字进行排序的,这种排序方式可以满足部分要求,但很多情况下我们并不希望这样排列!例如Anroid中的通讯录,音乐播放列表等等,这些情形下我们希望英文首字母和中文拼音首字母一样的排列在一起以方便查询。由于这类排序算法很复杂,例如首字母相同的字符串还要接着比较第二个、第三个...。但是如果我们将jdk自带的排序加以应用就不会显得那么复杂了;

我的想法是这样的:既然Java中排序是按数字->英文->汉字来进行排序的,那我们就把每个汉字打头的字符串前面加上一个该字符串第一个字符的拼音的首字母和一个区分符“&”,再使用jdk提供的排序函数进行排序,这时我们得到的就是我们想要的排序的数组了。然后再遍历数组,将包含&符号的字符串去掉&和第一个英文字母便完成了整个排序了,具体实现代码如下(获取汉字拼音需要引用该jar:pinyin4j-2.5.0.jar):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* 将字符串数字按首字母先后进行排序
*
* Java原生排序为 数字->英文->中文
* 为了将英文和中文首字母相同的排列到一起
* 先将字符串首字符为汉字的改为该汉字的首字母加上该字符串
* 为了以示区分中间再加一个分割符&
* 然后使用Java原生排序算法
* 再将包含&字符的字符串中的&和首字母去除从而达到排序目的
* */
public static void main(String[] args) {
  String[] arrays = new String[] { "gyu" , "sdf" , "zf" , "大同" , "收到" , "地方" , "三等分" , "的人" , "反对高铁" , "泛代数" , "上的投入" , "和国家" };
  for ( int i = 0 ; i < arrays.length; i++) {
   String str = arrays[i];
   if (str.length() == 0 )
   return ;
   String alphabet = str.substring( 0 , 1 );
   /*判断首字符是否为中文,如果是中文便将首字符拼音的首字母和&符号加在字符串前面*/
   if (alphabet.matches("[\\u4e00-\\u9fa5]+")) {
   str = getAlphabet(str) + "&" + str;
   arrays[i] = str;
   }
  }
  /*设置排序语言环境*/
  Comparator com = Collator.getInstance(java.util.Locale.CHINA);
  Arrays.sort(arrays, com);
  /*遍历数组,去除标识符&及首字母*/
  for ( int i= 0 ;i
   String str=arrays[i];
   if (str.contains( "&" )&&str.indexOf( "&" )== 1 ){
   arrays[i]=str.split( "&" )[ 1 ];
   }
   System.out.println(arrays[i]);
  }
  }
  public static String getAlphabet(String str) {
  HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  // 输出拼音全部小写
  defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  // 不带声调
  defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  String pinyin = null ;
  try {
   pinyin = (String) PinyinHelper.toHanyuPinyinStringArray(str.charAt( 0 ), defaultFormat)[ 0 ];
  } catch (BadHanyuPinyinOutputFormatCombination e) {
   e.printStackTrace();
  }
  return pinyin.substring( 0 , 1 );
}

这时输出结果为:“大同 的人 地方 反对高铁 泛代数 gyu 和国家 三等分 上的投入 收到 sdf zf”,大家也可以自己尝试自己写排序算法去实现,锻炼一下思维也不无坏处,呵呵。

PS:这里再为大家推荐2款比较实用的相关在线排序工具供大家参考使用:

在线中英文根据首字母排序工具:
http://tools.jb51.net/aideddesign/zh_paixu

在线文本倒序翻转排序工具:
http://tools.jb51.net/aideddesign/flipped_txt

 

 

 
传智播客.NET培训第24期 就业班 视频教程 教学视频 百度网盘下载 37G
传智播客.NET培训 基础+就业班 视频教程 教学视频 百度网盘下载
黑马JavaEE + Android就业班视频教程 教学视频 百度网盘下载 60G
达内Java 菜鸟零基础学习JAVA视频教程 教学视频 百度网盘下载
天下网校 Java教程视频 基础入门到精通 核心技术程序设计 教学视频
web层最火框架——SpringMVC attach_img
传智播客黑马程序员JavaEE28期就业班 attach_img
黑马程序员传智播客16期淘淘商城完整版视频教程 attach_img
2016.07.17黑马就业班32期JavaEE
尚学堂JAVA突击从零基础到就业4个月全程学习 百度云网盘(价值9800元)
潭州学院-JavaVIP的Javascript的高级进阶-KeKe老师 (视频加笔记代码)
扣丁学堂Java开发培训视频教程
动力节点王勇JAVA+SSH+J2EE项目 电信流程管理引擎系统视频
李兴华智囊团ssh开发案例
传智播客第33期Java/Spring/Struts2/web/基础/就业班视频
尚硅谷_宋红康,尚硅谷20天java核心技术教程
极客学院java语言学习
最新hibernate4课程视频教程
Struts+Spring+Hibernate框架及应用开发/Java
GOF设计模式

下一页 »

转载于:https://www.cnblogs.com/zenobiaf/p/10019989.html

你可能感兴趣的:(Java编程实现中英混合字符串数组按首字母排序的方法)