欢迎访问宙启技术站
智能推送

sort对List进行排序?

发布时间:2023-05-23 11:03:46

在Java中,List是一种动态大小的数据结构,可以存储一组元素,并且可以随时添加、删除、遍历元素。而sort方法可以对List进行排序。下面我们将详细讨论使用sort对List进行排序的方法。

一、List的排序方式

在Java中,List有两种排序方式:自然排序和定制排序。

1.自然排序

自然排序指的是要对List中的元素进行排序,这些元素必须实现Comparable接口,并且实现了compareTo方法。Comparable接口包含一个compareTo方法,该方法定义了比较对象与其他对象的大小关系。如:

public interface Comparable<T> {
    public int compareTo(T o);
}

Comparable接口只有一个方法,因此,实现该接口的类只需实现一个compareTo方法,就可以在sort方法中使用。

例如,如果要对Integer类型的List进行排序,只需使用Collections.sort方法,因为Integer实现了Comparable接口,它的compareTo方法定义了比较规则:

List<Integer> list = new ArrayList<>();
list.add(2);
list.add(5);
list.add(1);
list.add(3);
Collections.sort(list);
System.out.println(list);
//输出:[1, 2, 3, 5]

输出结果表明,sort方法将List按升序排序。

2.定制排序

当List中的元素没有实现Comparable接口,或者我们需要使用自己定义的比较规则时,就需要使用定制排序。定制排序指的是我们自定义比较规则来进行排序。我们需要在sort方法中传入一个Comparator接口,在其中定义自己的比较规则。

Comparator接口包含两个方法,分别是compare和equals。

compare方法是定义比较规则的核心方法。和compareTo方法比较相似,它接收两个参数,o1和o2,返回值是一个int类型的数值:

- 如果返回正数,表示o1比o2大;

- 如果返回0,表示o1和o2相等;

- 如果返回负数,表示o1比o2小。

例如,如果我们需要对Person对象按照年龄进行排序,我们可以定义一个PersonAgeComparator类,实现Comparator接口:

public class PersonAgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
    }
}

使用该比较器对Person的List进行排序:

List<Person> list = new ArrayList<>();
list.add(new Person("Tom", 23));
list.add(new Person("Jerry", 24));
list.add(new Person("Mike", 21));
list.add(new Person("Bob", 22));
Collections.sort(list, new PersonAgeComparator());
System.out.println(list);
//输出:[Mike(21), Bob(22), Tom(23), Jerry(24)]

输出结果表明,List按照Person对象的年龄进行了排序。

二、List排序的代码实现

List接口提供了sort方法来对List进行排序。sort方法有两个重载版本:

static <T extends Comparable<? super T>> void sort(List<T> list); //自然排序

static <T> void sort(List<T> list, Comparator<? super T> c); //定制排序

个方法参数是要排序的List,第二个方法使用Comparator实现定制排序。下面我们将对它们分别进行介绍。

1.自然排序代码实现

自然排序是指对实现Comparable接口的类进行排序,这些类已经定义了比较规则。因此,我们只需调用sort方法,传入List即可。这里使用Integer类型的List作为例子。

List<Integer> list = new ArrayList<>();
list.add(2);
list.add(5);
list.add(1);
list.add(3);
Collections.sort(list);
System.out.println(list);
//输出:[1, 2, 3, 5]

输出结果表明,List按升序排列了。

2.定制排序代码实现

对于没有实现Comparable接口的类,或者需要自定义比较规则时,我们需要使用定制排序。定制排序需要通过Comparator接口实现。例如,我们有一个Person类:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name + "(" + age + ")";
    }
}

我们需要按照年龄排序这个类,我们可以自定义一个PersonAgeComparator比较器:

public class PersonAgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
    }
}

然后在sort方法中,传入我们自定义的比较器即可:

List<Person> list = new ArrayList<>();
list.add(new Person("Tom", 23));
list.add(new Person("Jerry", 24));
list.add(new Person("Mike", 21));
list.add(new Person("Bob", 22));
Collections.sort(list, new PersonAgeComparator());
System.out.println(list);
//输出:[Mike(21), Bob(22), Tom(23), Jerry(24)]

输出结果表明,List按照Person对象的年龄进行了排序。

三、List排序的时间复杂度

List中的sort方法使用的是快速排序算法,它的平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n^2)。当List中的元素数量很大时,这个时间开销是不容忽视的。因此,对于数组的排序问题,我们可以使用Arrays.sort方法,它在内部使用的是归并排序。

四、小结

使用sort方法对List进行排序是Java编程中的常用操作。根据需要,我们可以使用自然排序或定制排序,以实现不同的排序方式。在进行排序时,我们还需要考虑时间复杂度问题,可以通过选择合适的排序算法来提高效率。