多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
![](https://img.kancloud.cn/2f/45/2f459861d963c59dddd56d7466da4381_643x611.png) [TOC] # 1. 排序方式 对于有序的集合来说,排序方式有如下几种。 **1. 自然排序** 集合提供的默认排序方式,原理是存储到集合中的元素实现了 Comparable 接口,通过实现接口中的`compareTo`方法进行排序。 ```java // 如Integer就实现了Comparable接口,并实现了compareTo方法 public final class Integer extends Number implements Comparable<Integer> { public int compareTo(Integer anotherInteger) { return compare(this.value, anotherInteger.value); } } ``` <br/> **2. 插入顺序** 按插入顺序进行排序,如 ArrayList。 <br/> **3. 调用`Collections.sort`排序** ```java // 根据其元素的natural ordering对指定的列表进行排序。 static <T extends Comparable<? super T>> void sort(List<T> list) // 根据指定的比较器引起的顺序对指定的列表进行排序。 static <T> void sort(List<T> list, Comparator<? super T> c) ``` >[warning]注意:`Collections.sort`方法是一个改变器 <br/> **4. 自定义排序** 我们重写默认的排序规则,实现我们想要的排序规则。 <br/> # 2. 自定义排序 案例代码:https://gitee.com/flymini/codes02/tree/master/collection_/com-learn-collection01 **** 自定义排序有下面几种方法来实现。 **1. `void sort(List<T> list)`** (1)元素实现接口 Comparable。 ```java @Data @NoArgsConstructor @AllArgsConstructor public class Student implements Comparable<Student> { private String name; private int age; @Override public int compareTo(Student o) { //根据年龄进行排序,这种写法是升序排序 return this.age - o.age; //return o.age-this.age; 这个写法是降序排序 } } ``` (2)调用方法`void sort(List<T> list)`进行排序。 ```java @Test public void testSort() { Student zhangsan = new Student("zhangsan", 21); Student lisi = new Student("lisi", 22); Student wangwu = new Student("wangwu", 20); List<Student> students = new ArrayList<>(); students.add(zhangsan); students.add(lisi); students.add(wangwu); //在ArrayList中排序是根据插入顺序进行排序的,此时定制排序还没起作用 System.out.println(students); //[Student(name=zhangsan, age=21), Student(name=lisi, age=22), Student(name=wangwu, age=20)] //调用sort方法后,定制排序就起作用了 Collections.sort(students); System.out.println(students); //[Student(name=wangwu, age=20), Student(name=zhangsan, age=21), Student(name=lisi, age=22)] } ``` <br/> **2. `void sort(List<T> list, Comparator<? super T> c)`** ```java @Test public void testSort() { List<Integer> list = new ArrayList<>(); list.add(200); list.add(100); list.add(300); //使用默认排序 System.out.println(list); //[200, 100, 300] //使用比较器排序 Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { //这是升序排序 return o1 - o2; //return o2-o1; 这是降序排序 } }); System.out.println(list); //[100, 200, 300] } ``` <br/> **3. Comparable和Comparator的使用场景** (1)对于可以被继承的类,我们可以使用 Comparable,或者 Comparator 进行定制排序。 (2)对于不可以被继承的类,那只能用 Comparator 进行定制排序。如 Integer 就不能被继承,所以我们无法继承 Integer,从而实现 Comparable 接口来定制排序。 ```java //Integer无法被继承 class CustomInteger extends Integer implements Comparable<CustomInteger> { ```