黑马程序员技术交流社区

标题: 关于TreeSet中,添加汉语排序问题 [打印本页]

作者: 杨剑    时间: 2013-3-17 20:20
标题: 关于TreeSet中,添加汉语排序问题
本帖最后由 杨剑 于 2013-3-17 23:20 编辑

在TreeSet集合中,我们知道可以实现字符串的自然顺序排序,也可以实现自定义对象进行排序。
我想问的是能否实现自定义函数中的中文进行一定方式的排序,比如,在Person
对象中,弄三个对象,比如new Person("zhangsan",18);new Person("lisi",19);
new Person("wangwu",20),变成new Person("张三",18);new Person("李四",19);
new Person("王五",20),排序方式按照每个字的拼音自然顺序排序,张的拼音首字母是z,李的拼音首字母是l
王的拼音首字母是w,排序为:李四,王五,张三,不知道怎么实现。
前面只是实现了字符串的自然顺序排序:
  1. import java.util.*;

  2. public class StudentDemo {
  3.         public static void main(String[] args) {
  4.                 TreeSet ts = new TreeSet();
  5.                 ts.add(new Student("zhangsan", 15));
  6.                 ts.add(new Student("lisi", 17));
  7.                 ts.add(new Student("wangwu", 16));

  8.                 Iterator it = ts.iterator();
  9.                 while (it.hasNext()) {
  10.                         Student stu = (Student) it.next();
  11.                         System.out.println(stu.getName() + "::" + stu.getAge());
  12.                 }
  13.         }

  14. }

  15. class Student implements Comparable {
  16.         private String name;
  17.         private int age;

  18.         Student(String name, int age) {
  19.                 this.name = name;
  20.                 this.age = age;
  21.         }

  22.         public String getName() {
  23.                 return name;
  24.         }

  25.         public void setName(String name) {
  26.                 this.name = name;
  27.         }

  28.         public int getAge() {
  29.                 return age;
  30.         }

  31.         public void setAge(int age) {
  32.                 this.age = age;
  33.         }

  34.         public int compareTo(Object obj) {
  35.                 if (!(obj instanceof Student))
  36.                         throw new RuntimeException("不是学生对象");
  37.                 Student stu = (Student) obj;
  38.                 if (!(this.name.equals(stu.name)))
  39.                         return this.name.compareTo(stu.name);
  40.                 return this.age - stu.age;
  41.         }
  42. }
复制代码
打印结果是:lisi::17
                   wangwu::16
                   zhangsan::15
如果添加的是中文,不知道怎么按照李四,王五,张三这种方式排序?如果不可实现,说下原因,非常感谢

作者: TK13761    时间: 2013-3-17 22:04
我查了一下 找到一个能排中文名字的程序,本来想弄到Student类中来 可是惭愧啊 弄了半天也没弄出来  {:soso_e140:}   但我还是觉得要把查到代码给你 或许对你能有帮助呢 亲测代码可运行
  1. import java.util.*;
  2. import java.text.CollationKey;  
  3. import java.text.Collator;
  4. public class TreeSetTest1
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 //指定比较语言为中文
  9.                 TreeSet<Object> set = new TreeSet<Object>(MyComparator.getInstance(Locale.CHINA));
  10.                
  11.                 set.add("张三");
  12.                 set.add("李四");
  13.                 set.add("王五");
  14.                 set.add("赵六");
  15.                
  16.                 System.out.println(set);
  17.                
  18.                 for(Iterator<Object> iter = set.iterator(); iter.hasNext();)
  19.                 {
  20.                         String value = (String)iter.next();
  21.                         
  22.                         System.out.println(value);
  23.                 }
  24.         }
  25. }

  26. //继承Collator类,可以指定比较的语言环境
  27. class MyComparator extends Collator
  28. {
  29.         //定义自己的比较规则(实现汉字字符串的倒序排序)
  30.         //覆盖父类中的方法
  31.         public int compare(String s1, String s2)
  32.         {
  33.                 return s2.compareTo(s1);
  34.         }

  35.         //@覆盖父类中的方法
  36.         public CollationKey getCollationKey(String source)
  37.         {
  38.                 return null;
  39.         }

  40.         //覆盖父类中的方法
  41.         public int hashCode()
  42.         {
  43.                 return 0;
  44.         }
  45. }
复制代码

作者: 刘凯    时间: 2013-3-17 22:36
谭仁龙 发表于 2013-3-17 22:04
我查了一下 找到一个能排中文名字的程序,本来想弄到Student类中来 可是惭愧啊 弄了半天也没弄出来  {:soso ...

楼上 比较器继承了Collator  就不用实现Comparator了么?
作者: 杨剑    时间: 2013-3-17 23:18
谭仁龙 发表于 2013-3-17 22:04
我查了一下 找到一个能排中文名字的程序,本来想弄到Student类中来 可是惭愧啊 弄了半天也没弄出来  {:soso ...

学习了,非常感谢谭兄,知道中文排序的方式了。
作者: 杨剑    时间: 2013-3-17 23:22
刘凯 发表于 2013-3-17 22:36
楼上 比较器继承了Collator  就不用实现Comparator了么?

应该这样理解,中文排序的话,Collator代替了Comparator吧。
作者: 谢洋    时间: 2013-3-17 23:28
Collator已实现Comparator,下面是API
Collator 类执行区分语言环境的 String 比较。使用此类可为自然语言文本构建搜索和排序例程。
Collator 是一个抽象基类。其子类实现具体的整理策略。Java 平台目前提供了 RuleBasedCollator 子类,它适用于很多种语言。还可以创建其他子类,以处理更多的专门需要。
与其他区分语言环境的类一样,可以使用静态工厂方法 getInstance 来为给定的语言环境获得适当的 Collator 对象。如果需要理解特定整理策略的细节或者需要修改策略,只需查看 Collator 的子类即可。


作者: 杨剑    时间: 2013-3-17 23:41
谢洋 发表于 2013-3-17 23:28
Collator已实现Comparator,下面是API
Collator 类执行区分语言环境的 String 比较。使用此类可为自然语言文 ...

说的很详细,非常感谢,我的理解就是Collator实现了Comparator接口,就是扩展了新的功能,多了个中文排序的功能,学习就应该这样可以举一反三,再次感谢谢洋兄的详细说明。
作者: 小路飞    时间: 2013-3-18 00:12
原来也可以依照中文排序啊,长见识了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2