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