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

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

?
1
2
3
4
5
6
7
String[] arrays = new String[] { "gyu" , "sdf" , "zf" , "大同" , "收到" , "地方" , "三等分" , "的人" , "反对高铁" , "泛代数" , "上的投入" , "和国家" };
/*设置语言环境*/
Comparator<Object> 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<Object> com = Collator.getInstance(java.util.Locale.CHINA);
  Arrays.sort(arrays, com);
  /*遍历数组,去除标识符&及首字母*/
  for ( int i= 0 ;i<arrays.length;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

 

 

下一页 »

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值