在C、C++中有很多排序算法,但是通常排序算法不得不让程序员在写代码的过程中陷入对底层很多指针和位置的理解,java不希望这样,所以排序大多可以由java帮你做掉,例如,你要对一个数组排序,通过:Collections.sort(list)那么这个list被排序了,排序终调用的是Arrays.sort方法来完成的,所以数组自然是用Arrays.sort了,而SortedSet里面内部也有排序功能也是类似的方式的来实现的,只是内部调用了相关的方法来完成而已;SortedSet只是一个接口,实现类有很多,本文以TreeSet实现类作为例子。
  而排序必然存在对比大小,那么传递的信息,java是通过什么来对比大小的呢?compareTo这个来对比的,而内部对比过程中,需要将数据转换为Comparable来对比,所以你的对象需要implementsComparable,并实现内部的方法compareTo,只要你的compareTo实现是你所想要的,那么排序必然是正确的,那么是否还有其他的方法,有的,排序的时候,允许你传入一个对比类,因为这样也可以减少一些空指针出现的可能性,传入的类需要实现:Comparator接口,实现其方法:compare类,虽然接口中还定义了equals方法基本不用管它,因为Object已经实现了,并且内部排序中并没有用到equals方法来做排序。
  下面开始使用实例分别来做中文排序、对象排序,并分别使用对象实现Comparable接口,以及单独定义排序对象实现Comparator接口来完成排序:
  实例1(通过实现Comparator接口完成中文排序):
import java.text.Collator;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ChineseSortCompare {
@SuppressWarnings("rawtypes")
private final static Comparator CHINA_COMPARE = Collator.getInstance(java.util.Locale.CHINA);
public static void main(String []args) {
sortArray();
sortList();
System.out.println("李四".compareTo("张三"));//前者大于后者,则为正数,否则为负数,相等为0
}
@SuppressWarnings("unchecked")
private static void sortList() {
List<String>list = Arrays.asList("张三", "李四", "王五");
Collections.sort(list , CHINA_COMPARE);
for(String str : list) {
System.out.println(str);
}
}
@SuppressWarnings("unchecked")
private static void sortArray() {
String[] arr = {"张三", "李四", "王五"};
Arrays.sort(arr, CHINA_COMPARE);
for(String str : arr) {
System.out.println(str);
}
}
}
  可以看到输出的结果都是一样的,当然String本身有compare方法,而且其本身也是实现了Comparable接口的,所以你如果不放入CHINA_COMPARE来进行处理的话,将会默认按照String自己的compareTo来做排序,排序的结果自然不是你想要的,当然英文应该是你想要的。
  实例2(通过外部定义Comparator来完成对象排序):
  这里首先要构造一个对象的类,为了简单,我们用两属性,定义一个UserDO这样一个类,描述如下:
public class UserDO {
protected String name;
protected String email;
public UserDO() {}
public UserDO(String name , String email) {
this.name = name;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
  定义了两个属性为name和email,此时我们想要按照name了排序,那么我们定义排序的类如下:
  import java.text.Collator;
  import java.util.Comparator;
  public class UserDOComparator implements Comparator<UserDO> {
  Collator cmp = Collator.getInstance(java.util.Locale.CHINA);
  @Override
  public int compare(UserDO userDO1, UserDO userDO2) {
  return cmp.compare(userDO1.getName(), userDO2.getName());
  }
  }
  此时可以看出我们实现了compare方法,是使用拼音排序的,然后我们来模拟一些数据验证结果:
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
public class SortUserListTest {
private final static UserDOComparator USER_COMPARATOR = new UserDOComparator();
public static void main(String []args) {
sortUserDOArray();
sortUserDOList();
sortUserBySortedSet();
}
private static void sortUserBySortedSet() {
SortedSet<UserDO>userSet = new TreeSet<UserDO>(USER_COMPARATOR);
userSet.add(new UserDO("张三" , "aaazhangsan@ddd.com"));
userSet.add(new UserDO("李四" , "ddlisi@dsfds.com"));
userSet.add(new UserDO("王五" , "ddwangwu@fsadfads.com"));
for(UserDO userDO : userSet) {
System.out.println(userDO.getName());
}
}
private static void sortUserDOList() {
List<UserDO>list = Arrays.asList(
new UserDO("张三" , "aaazhangsan@ddd.com"),
new UserDO("李四" , "ddlisi@dsfds.com"),
new UserDO("王五" , "ddwangwu@fsadfads.com")
);
Collections.sort(list , USER_COMPARATOR);
for(UserDO userDO : list) {
System.out.println(userDO.getName());
}
}
private static void sortUserDOArray() {
UserDO []userDOArray = new UserDO[] {
new UserDO("张三" , "aaazhangsan@ddd.com"),
new UserDO("李四" , "ddlisi@dsfds.com"),
new UserDO("王五" , "ddwangwu@fsadfads.com")
};
Arrays.sort(userDOArray , USER_COMPARATOR);
for(UserDO userDO : userDOArray) {
System.out.println(userDO.getName());
}
}
}
  根据这些输入,你可以看到它的输出和实际想要的按照名称的拼音排序是一致的,那么有人会问,如果我按照两个字段排序,先按照一个字段排序,再按照另一个字段排序该怎么办,其次如果是倒叙应该是如何操作,其实倒叙来讲只需要在compare方法中将原有的输出改成相反数可以了,compare得到的结果为正数、负数、或0,若为正数,代表第一个数据比第二个大,而负数相反,为0的时候代表相等;而多字段排序也是如此,通过第一层排序后得到结果,看是否是0,如果是0,那么再按照第二个字段排序即可,否则直接返回第一层返回的结果,两者混合应用以及多层排序自然实现了。