本帖最后由 崔维友 于 2012-11-26 08:53 编辑
通过对比较器Comparator的compare方法重写,我们可以很方便的按照自己的意愿对元素进行排序。但是如果作为键的比较内容是汉字,可能不会得到我们想要的结果,因为Comparable中的compareTo方法比较汉字时用的特定编码值。
不过Java还提供了Collator类,它实现Comparator接口,执行区分语言环境的String比较,与其他区分语言环境的类一样,可以使用静态方法getInstance来为给定的语言环境获得适当的Collator对象。
还有CollationKey类,表示遵守特定Collator对象规则的String。比较两个CollationKey将返回它们所表示的String的相对顺序。使用CollationKey来比较String通常比使用Collator.compare更快。不能直接创建CollationKey。而是通过调用Collator.getCollationKey来生成。只能比较同一个Collator对象生成的CollationKey。
代码示例:- /*
- 学生:姓名、年龄,地址。
- 姓名和年龄相同的视为同一人。
- */
- import java.text.*;
- import java.util.*;
- import java.util.Locale.*;
- class Student
- {
- private String name;
- private int age;
- Student(String name, int age)
- {
- this.name=name;
- this.age=age;
- }
- public String getName(){
- return name;
- }
- public int getAge(){
- return age;
- }
- public String toString(){
- return name+"___"+age;
- }
- }
- //汉字比较器
- class StuNameComp implements Comparator<Student>
- {
- public int compare(Student stu1, Student stu2)
- {
- String s1=stu1.getName();
- String s2=stu2.getName();
- //Collator类执行区分语言环境的String比较,与其他区分语言环境的类一样,可以使用静态方法getInstance来为给定的语言环境获得适当的Collator对象。
- Collator collator = Collator.getInstance(Locale.CHINA);
- //CollationKey表示遵守特定Collator对象规则的String。比较两个CollationKey将返回它们所表示的String的相对顺序。使用CollationKey来比较String通常比使用Collator.compare更快。
- //不能直接创建CollationKey。而是通过调用Collator.getCollationKey来生成。只能比较同一个Collator对象生成的CollationKey。
- CollationKey key1 = collator.getCollationKey(s1);
- CollationKey key2 = collator.getCollationKey(s2);
-
- int num=key1.compareTo(key2);
- if (num==0)
- {
- return new Integer(stu1.getAge()).compareTo(new Integer(stu2.getAge()));
- }
- return num;
- }
- }
- class MapTest
- {
- public static void main(String[] args)
- {
- TreeMap<Student, String> ts=new TreeMap<Student, String>(new StuNameComp());
- ts.put(new Student("周鑫",21),"高庄");
- ts.put(new Student("英雄",24),"南埠东");
- ts.put(new Student("赵伟",26),"北麻村");
- ts.put(new Student("崔强",24),"南埠东");
- ts.put(new Student("一晴",24),"南埠东");
- //ts.put(new Student("怡情",24),"南埠东"); //“怡”字在Collator比较中存在bug,总是排在最后
- //ts.put(new Student("怡清",24),"南埠东");
- ts.put(new Student("李凯",23),"付家庄");
- ts.put(new Student("周红",25),"高庄");
- System.out.println();
- Set<Map.Entry<Student, String>> entrySet=ts.entrySet();
- Iterator<Map.Entry<Student, String>> ime=entrySet.iterator();
- while (ime.hasNext())
- {
- Map.Entry<Student, String> me=ime.next();
- Student s=me.getKey();
- String addr=me.getValue();
- System.out.println(s.toString()+"..."+addr);
- }
- }
- }
复制代码
--------------------------------------------------------------
通过这个方法可以满足汉字排序的一般需要,但是存在一个bug,就是汉字“怡”,首字为怡时一定往后放;多个首字为怡的词语排序时,再按照后面的字排序。
新手入门,才疏学浅,希望哪位有更好的方法的能够不吝赐教!
|