Collection集合--对List集合元素排序的两种方法

一、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());
        });
    }

猜你喜欢

转载自blog.csdn.net/makeliwei1/article/details/81267629