Collections工具集中的sort() public static <T> void sort(List<T> list) public static <T> void sort(List<T> list,Comparator<? super T> c)
Comparator接口在java.util包下面,排序是Comparator须要实现的功能之一,该接口表明的是是一个比较器,比较器具备可比性,能够作排序的,本质其实比较两个对象谁排在前边谁排在后边。那么比较的方法是:java
public int compare(Object o1,Object o2):比较两个参数的的顺序 两个对象比较的结果有三种:大于,等于,小于 若是要按照升序排序:则o1小于o2返回(负数),相等返回0,o1大于o2返回(正数) 若是要按照降序排序:则o1小于o2返回(正数),相等返回0,o1大于o2返回(负数) 简化操做: 升序排序: o1-o2 降序排序: o2-o1
public static void main(String[] args) { //public static <T> void sort(List<T> list) ArrayList<String> list = new ArrayList<>(); list.add("abc"); list.add("cba"); list.add("bca"); list.add("sba"); list.add("nba"); // 排序规则,按照字符串的第一个字母降序排序 // 使用接口中的方法: // public static <T> void sort(List<T> list,Comparator<? super T> c) // public int compare(Object o1,Object o2):比较两个参数的的顺序 Collections.sort(list,new Comparator(){ @Override public int compare(String o1,Strng o2) { /*if(o2.charAt(0) - o1.charAt(0) > 0){ return 1; } else if ( o2.charAt(0) - o1.charAt(0) == 0){ return 0; } else { return -1; }*/ return o2.charAt(0) - o1.charAt(0); } }); System.out.println(list); } // 控制台结果: [sba,nba,cba,bca,abc]
Comparable:强行对实现它的每一个类对象进行总体排序。这种排序咱们通常把它称之为天然排序,类的compareTo方法被称之为它的天然比较方法。只能在类中实现compareTo方法一次,不能常常修改类的代码实现本身想要的排序。实现此接口的对象列表(和数组)能够经过Collections.sort()(和Arrays.sort())进行自动排序,对象能够用做有序映射中的键或者有序集合中的元素,无需指定比较器。数组
Comparator:强行对某个对象进行总体排序。能够将Comparator传递给sort()方法(如Collections.sort()后者Arrays.sort()),从而容许在排序顺序上实现精确控制。还可使用Comparator来控制某些数据结构(有序的set或者是有序的映射)的顺序,或者为那些没有天然顺序的对象Collection提供排序。数据结构
public class Student{ private String name; private int age; // get和set方法 // toString方法 // 无参构造和全参构造 } public class MainClass { public static void main(String[] args) { // 假如学生都是老外 名字都是字母 ArrayList<Student> list = new ArrayList<>(); list.add(new Student("tom",20)); list.add(new Student("lily",18)); list.add(new Student("jack",26)); list.add(new Student("rose",40)); list.add(new Studeng("smith",26)); // 按照年龄升序排序 // 若是年龄相同的话,而后按照姓名排序,按照姓名的首字母降序排序 Collections.sort(list,new Comparator(){ @Override public int compare(Student o1,Student o2) { int num = o1.getAge() - o2.getAge(); if( num == 0) { num = o2.getName().charAt(0) - o1.getName().charAt(0); } return num; } }) System.out.println(list); } } // 控制台输出的结果: [Student("lily",18),Student("tom",20),Student("jack",26),Student("rose",40)] // 二次控制台输出结果: [Student("lily",18),Student("tom",20),Studeng("smith",26),Student("jack",26),Student("rose",40)]