一. Collator 类
字符串的比较 可以用 compareTo() 的方法,这个方法重写了 comparable 接口的compareTo() 的方法,采用的是字典顺序的比较,如 a 在b 之前,y 在z 前面。 而中文字符串的比较呢,就不能用单纯的compareTo() 了。
中文字符串的排序,是按照拼音进行排序的。
@Test public void testE(){ String [] arr=new String[]{"一","二","三","中","国","阿","笔"}; System.out.println("排序之前:"); System.out.println(Arrays.toString(arr)); System.out.println("排序之后:"); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }
测试控制台输出为:
并没有进行排序。
Java提供了 一个 Collator 类 来进行中文字符串的比较。
Collator 的定义是:
public abstract class Collator implements java.util.Comparator<Object>, Cloneable { }
其拥有的主要方法是:
虽然是抽象类,但是仍然是可以实例化的, 用getInstance(Locale ) 方法进行实例化对象。
重写里面的 compare() 的方法进行比较。
二. Collator 实现中文字符串的排序
package com.yjl.compa; import java.text.Collator; import java.util.Comparator; import java.util.Locale; /** @atuhor:两个蝴蝶飞 @Description: 类描述 */ public class StringComparator implements Comparator<String> { //当前环境设置成 CHINA 中文。 在前面实例化对象 private Collator collator=Collator.getInstance(Locale.CHINA); @Override public int compare(String o1, String o2) { //调用内部的方法,进行比较。 return collator.compare(o1, o2); } }
三. 测试中文字符串的方法
@Test public void testD(){ String [] arr=new String[]{"一","二","三","中","国","阿","笔"}; System.out.println("排序之前:"); System.out.println(Arrays.toString(arr)); //转换成集合的形式,方便比较。 List<String> nameList=Arrays.asList(arr); nameList.sort(new StringComparator()); //输出当前排序后的集合。 System.out.println("排序之后:"); arr=nameList.toArray(new String []{}); System.out.println(Arrays.toString(arr)); }
打印日志输出为:
对应的拼音为 a,b,e,g,s,y,z , 实现了排序的功能。
四. Collator 实现对象的排序
还是用上一章的User 类, 按照名称和年龄进行排序。
四.一 User 类
package com.yjl.compa; /** @atuhor:两个蝴蝶飞 @Description: 类User */ public class User{ /** * @param id id编号 * @param name 姓名 * @param age 年龄 * @param score 成绩 * @param description 描述 */ private int id; private String name; private int age; private double score; private String description; public User(int id, String name, int age, double score, String description) { super(); this.id = id; this.name = name; this.age = age; this.score = score; this.description = description; } public User(){ super(); } public int getId() { return id; } public void setId(int id) { this.id = id; } 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; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + ", description=" + description + "]"; } }
四.二 定义规则
package com.yjl.compa; import java.text.Collator; import java.util.Comparator; import java.util.Locale; /** @atuhor:两个蝴蝶飞 @Description: 类描述 */ public class MyComparator implements Comparator<User>{ //当前环境设置成 CHINA 中文。 private Collator collator=Collator.getInstance(Locale.CHINA); @Override public int compare(User u1, User u2) { int result=collator.compare(u1.getName(),u2.getName()); if(result>0){ return 1; }else if(result<0){ return -1; }else{ if(u1.getAge()>u2.getAge()){ return 1; }else if(u1.getAge()<u2.getAge()){ return -1; }else{ return 0; } } } }
四.三 测试排序方法
package com.yjl.test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import com.yjl.compa.MyComparator; import com.yjl.compa.StringComparator; import com.yjl.compa.User; /** @atuhor:两个蝴蝶飞 @Description: 类描述 */ public class CompaTest { private List<User> allUser=new ArrayList<User>(); @Before public void initUserList(){ User user1=new User(1,"蝴蝶飞",24,98.0,"这是蝴蝶飞"); User user2=new User(2,"两个蝴蝶飞",24,99.0,"这是两个蝴蝶飞"); User user3=new User(3,"精灵",24,100.0,"这是精灵妹"); User user4=new User(4,"精灵",24,97.0,"这是精灵"); User user5=new User(5,"张三",25,98.0,"这是张三"); User user6=new User(6,"张三",24,99.0,"这是张三"); User user7=new User(7,"驭风",25,100.0,"这是驭风"); User user8=new User(8,"墨",25,97.0,"这是墨"); User user9=new User(9,"周",25,96.0,"这是周"); allUser.add(user1); allUser.add(user2); allUser.add(user3); allUser.add(user4); allUser.add(user5); allUser.add(user6); allUser.add(user7); allUser.add(user8); allUser.add(user9); } @Test public void testB(){ System.out.println("排序之前:"); allUser.forEach(n ->System.out.println(n)); allUser.sort(new MyComparator()); System.out.println("排序之后:"); allUser.forEach(n ->System.out.println(n)); }
控制台输出:
h,j,l,m,y,zh,zo 进行了拼音的排序。
当然,也可以用Comparable 接口进行排序。
五. 可以匿名类进行排序
@Test public void testB(){ System.out.println("排序之前:"); allUser.forEach(n ->System.out.println(n)); //一定要将collator 对象写在外面。 Collator collator=Collator.getInstance(Locale.CHINA); allUser.sort(new Comparator<User>() { @Override public int compare(User u1, User u2) { int result=collator.compare(u1.getName(),u2.getName()); if(result>0){ return 1; }else if(result<0){ return -1; }else{ if(u1.getAge()>u2.getAge()){ return 1; }else if(u1.getAge()<u2.getAge()){ return -1; }else{ return 0; } } } }); System.out.println("排序之后:"); allUser.forEach(n ->System.out.println(n)); }
也同样可以进行相应的排序。
谢谢!!!