A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨剑 中级黑马   /  2013-3-17 20:20  /  1981 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨剑 于 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
如果添加的是中文,不知道怎么按照李四,王五,张三这种方式排序?如果不可实现,说下原因,非常感谢

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
我查了一下 找到一个能排中文名字的程序,本来想弄到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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
谭仁龙 发表于 2013-3-17 22:04
我查了一下 找到一个能排中文名字的程序,本来想弄到Student类中来 可是惭愧啊 弄了半天也没弄出来  {:soso ...

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

学习了,非常感谢谭兄,知道中文排序的方式了。
回复 使用道具 举报
刘凯 发表于 2013-3-17 22:36
楼上 比较器继承了Collator  就不用实现Comparator了么?

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

回复 使用道具 举报
杨剑 中级黑马 2013-3-17 23:41:05
7#
谢洋 发表于 2013-3-17 23:28
Collator已实现Comparator,下面是API
Collator 类执行区分语言环境的 String 比较。使用此类可为自然语言文 ...

说的很详细,非常感谢,我的理解就是Collator实现了Comparator接口,就是扩展了新的功能,多了个中文排序的功能,学习就应该这样可以举一反三,再次感谢谢洋兄的详细说明。
回复 使用道具 举报
小路飞 来自手机 中级黑马 2013-3-18 00:12:35
8#
原来也可以依照中文排序啊,长见识了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马