黑马程序员技术交流社区
标题:
集合中按照汉字的拼音排序探讨
[打印本页]
作者:
崔维友
时间:
2012-11-24 14:02
标题:
集合中按照汉字的拼音排序探讨
本帖最后由 崔维友 于 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);
}
}
}
复制代码
bijiao.PNG
(6 KB, 下载次数: 18)
下载附件
2012-11-24 13:57 上传
--------------------------------------------------------------
通过这个方法可以满足汉字排序的一般需要,但是存在一个bug,就是汉字“怡”,首字为怡时一定往后放;多个首字为怡的词语排序时,再按照后面的字排序。
新手入门,才疏学浅,希望哪位有更好的方法的能够不吝赐教!
作者:
刘菲
时间:
2012-11-25 22:06
看过了,你很认真,要加油啊
作者:
崔维友
时间:
2012-11-26 08:44
刘菲 发表于 2012-11-25 22:06
看过了,你很认真,要加油啊
:handshake,过奖了。一起努力!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2