一、List接口中sort方法
首先我们来看一下List接口中的sort方法
从这个描述我们可以看到,我们可以根据具体的Comparator对List结合中的元素进行排序,如果传入的comparator是null的时候,那么集合中的元素必须实现Comparable接口实现自然排序。从上面的一段话我们知道List集合对元素排序的方法有以下两种
方法 | 方法描述 |
---|---|
方法一 | List中的元素自己实现一个Comparable接口实现一个自然排序 |
方法二 | 我们通过传入一个实现了Comparator接口实现一个排序 |
顺便提一句:对于集合的排序算法,底层使用的是MergeSort
二、代码实现
2.1、List中的元素自己实现一个Comparable接口实现一个自然排序
这里我实现对Person 中age这个字段进行排序
package CollectionLearn;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* Created by luckyboy on 2018/7/29.
*/
public class SortList {
private List<Person> list = new ArrayList<Person>();
private Person p1 = new Person(2,"name1");
private Person p2 = new Person(3,"name3");
private Person p3 = new Person(1,"name4");
private Person p4 = new Person(4,"name2");
@Test
public void testCommonType_I(){
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.sort(null);//传入的Comparator=null,实现自然排序
//遍历集合
list.forEach(item->{
System.out.println(item.toString());
});
}
}
class Person implements Comparable{
int age;
String name;
public Person(){};
public Person(int age,String name){
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Object o) {
Person p = (Person)o;
if(this.getAge()-p.getAge()<0){
return -1;
}
if(this.getAge()-p.getAge()>0){
return 1;
}
return 0;
}
}
输出结果
Person{age=1, name='name4'}
Person{age=2, name='name1'}
Person{age=3, name='name3'}
Person{age=4, name='name2'}
如果Person对象没有实现Comparable接口,那么就会抛出下面的异常
java.lang.ClassCastException: CollectionLearn.Person cannot be cast to java.lang.Comparable
at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
at java.util.Arrays.sort(Arrays.java:1312)
at java.util.Arrays.sort(Arrays.java:1506)
at java.util.ArrayList.sort(ArrayList.java:1460)
2.2、我们通过实现一个Comparator接口的类对Person对象进行排序
/**
class PersonNameComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.compareTo(o2);
}
@Override
public Comparator reversed() {
return null;
}
@Override
public Comparator thenComparing(Comparator other) {
return null;
}
@Override
public Comparator thenComparingInt(ToIntFunction keyExtractor) {
return null;
}
@Override
public Comparator thenComparingLong(ToLongFunction keyExtractor) {
return null;
}
@Override
public Comparator thenComparingDouble(ToDoubleFunction keyExtractor) {
return null;
}
@Override
public Comparator thenComparing(Function keyExtractor) {
return null;
}
@Override
public Comparator thenComparing(Function keyExtractor, Comparator keyComparator) {
return null;
}
}
测试代码
@Test
public void testCommonType_II(){
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.sort(new PersonNameComparator());
//遍历集合
list.forEach(item->{
System.out.println(item.toString());
});
}