【Java】【集合&数组】【排序】【Java中对汉字进行简单的排序】2016.02.28

1、对数组的包含中文元素来进行排序 java

在Java中通常的String数组排序能够调用Arrays类的sort(Object[] a)方法进行排序,代码相似:算法

[java] view plain copy print?数组

  1. String[] strs = {"张三(Z)""李四(L)""王五(W)"};  ide

  2. // 排序,默认是升序  函数

  3. Arrays.sort(strs);  ui

        可是当咱们将以上结果打印出来,你会发现结果很混乱,并非和咱们预想的那样按照汉语拼音进行排序的。为什么呢?咱们知道该方法是经过数组元素的compareTo方法来进行比较的,那咱们看看String类的compareTo的主要实现:this

[java] view plain copy print?编码

  1. while (k < lim) {  spa

  2.     // 原字符串的字符数组  .net

  3.     char c1 = v1[k];  

  4.     // 比较字符串的字符数组   

  5.     char c2 = v2[k];  

  6.     if (c1 != c2) {   

  7.         // 比较二者的char值大小   

  8.         return c1 - c2;  

  9.     }  

  10.     k++;  

  11. }  

        上面的代码先取得字符串的字符数组,而后一个一个地比较大小,这里是字符进行比较(使用减号),也就是UNICODE码值进行比较,而并非经过汉字的拼音进行排序的,这一点在JDK的说明文档中也有说明:对于非英文的String排序可能会出现不许确的状况。那该如何解决该问题呢?Java推荐使用Collator类进行排序,代码以下:

[java] view plain copy print?

  1. String[] strs = {"张三(Z)""李四(L)""王五(W)"};  

  2. // 定义一个中文排序器  

  3. Comparator c = Collator.getInstance(Locale.CHINA);  

  4. // 升序排序  

  5. Arrays.sort(strs, c);  

        可是Java并不能精确的对全部的汉字进行排序,好比对“犇”和“鑫”进行排序,你就会发现结果又乱了!只是由于咱们的汉字文化太博大精深了,要作好这个排序确实有点难为Java了。更深层次的缘由是Java使用的是 UNICODE 编码,而中文 UNICODE 字符集是来源于 GB18030 的,GB18030 又是从GB2312 发展起来的, GB2312 是一个包含  7000 多个字符的字符集,它是按照拼音排序,而且是连续的,以后的 GBK、GB2312 都是在起基础上扩充而来的,因此要让它们完整排序也就难上加难了。但若是排序对象是常常使用的汉字,使用Collator类排序彻底能够知足咱们的要求。

        若是须要严格排序,可使用一些开源项目来本身实现,好比 pinyin4j 能够把汉字转换为拼音,而后咱们本身来实现排序算法,不过此时你也会发现要考虑诸如算法、同音字、多音字等众多问题。

        pinyin4j下载地址:http://pinyin4j.sourceforge.net/


2、以上是对数组中的中文元素进行排序,下面是对集合中的中文元素来进行排序

(注:对于集合中的排序,List集合自身并不带有排序的功能,因此咱们须要自定义比较器,而后在主函数当中去调用Collections这个类中的sort静态方法来实现集合中的比较,这样集合在输出的时候就是已经排序好的汉字了;其中,集合中的比较器有两个,一个是Comparable,另外一个则是Comparator,两个接口的用法也是大同小异)

下面是针对ArrayList集合中的中文来进行比较输出的代码

package com.geminno.he0228; import java.text.CollationKey; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Locale; public class SortStringDemo { public static void main(String[] args) { // TODO Auto-generated method stub List<Student> list=new ArrayList<>(); list.add(new Student("张三 4zhang", 23));//zhang  4 list.add(new Student("李四 1li", 20));//li  1 list.add(new Student("王五 3wang", 30));//wang  3 list.add(new Student("赵六 5zhao", 52));//zhao  5 list.add(new Student("刘七 2liu", 16));//liu  2 Collections.sort(list,new Student()); Iterator<Student>iterator=list.iterator(); while (iterator.hasNext()) { Student student = (Student) iterator.next(); System.out.println(student.getName()+" "+student.getAge()); } } } class Student implements Comparator<Student>{ private String name; private int age; private Collator collator=Collator.getInstance(Locale.CHINA); public Student() { // TODO Auto-generated constructor stub } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub // 使用默认语言环境的规则将此 String 中的全部字符都转换为小写 //把字符串转换为一系列比特,它们能够以比特形式与 CollationKeys 相比较       CollationKey key1=collator.getCollationKey(o1.name);// toLowerCase()方法 返回的是String类型,       CollationKey key2=collator.getCollationKey(o2.name);      return key1.compareTo(key2);//返回的分别为1,0,-1 分别表明大于,等于,小于。要想按照字母降序排序的话 加个“-”号   } }package com.geminno.he0228; import java.text.CollationKey; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Locale; public class SortStringDemo { public static void main(String[] args) { // TODO Auto-generated method stub List<Student> list=new ArrayList<>(); list.add(new Student("张三 4zhang", 23));//zhang  4 list.add(new Student("李四 1li", 20));//li  1 list.add(new Student("王五 3wang", 30));//wang  3 list.add(new Student("赵六 5zhao", 52));//zhao  5 list.add(new Student("刘七 2liu", 16));//liu  2 Collections.sort(list,new Student()); Iterator<Student>iterator=list.iterator(); while (iterator.hasNext()) { Student student = (Student) iterator.next(); System.out.println(student.getName()+" "+student.getAge()); } } } class Student implements Comparator<Student>{ private String name; private int age; private Collator collator=Collator.getInstance(Locale.CHINA); public Student() { // TODO Auto-generated constructor stub } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub // 使用默认语言环境的规则将此 String 中的全部字符都转换为小写 //把字符串转换为一系列比特,它们能够以比特形式与 CollationKeys 相比较       CollationKey key1=collator.getCollationKey(o1.name);// toLowerCase()方法 返回的是String类型,       CollationKey key2=collator.getCollationKey(o2.name);      return key1.compareTo(key2);//返回的分别为1,0,-1 分别表明大于,等于,小于。要想按照字母降序排序的话 加个“-”号   } }

其中咱们须要用到Collator这个类

转载于:https://my.oschina.net/YongfengHe/blog/625500