Java ArrayList sort() 方法

ArrayList sort() 方法根据指定的 Comparator 实例引入的顺序对列表进行排序。
列表中的所有元素必须可以相互比较。

之路教程 https://onitr oad .com

ArrayList sort() - 按字段对对象列表进行排序

当我们想要对给定的对象列表排序但不是按自然顺序排序时,比较器最有用。
例如,员工列表自然应按其员工 ID 进行排序。

比较器的另一个用例是当列表中的对象没有实现 Comparable 接口时。
此外,我们可能希望在不同场景下以不同方式对对象列表进行排序。

例如,员工列表可以按姓名、年龄或者任何其他此类字段进行排序。
比较器最适合这些类型的要求。

Employee类型

让我们创建一个只有 3 个字段的简单Employee类。

import java.time.LocalDate;
public class Employee {
    private Long id;
    private String name;
    private LocalDate dob;
    public Employee(Long id, String name, LocalDate dob) {
        super();
        this.id = id;
        this.name = name;
        this.dob = dob;
    }
    //Getters and Setters
    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", dob=" + dob + "]";
    }
}

比较器类以启用对不同字段的排序

比较器按姓名字母顺序对员工列表进行排序。

import java.util.Comparator;
public class NameSorter implements Comparator<Employee> 
{
    @Override
    public int compare(Employee o1, Employee o2) {
        return o2.getName().compareToIgnoreCase(o1.getName());
    }
}

比较器按年龄升序对员工列表进行排序。

import java.util.Comparator;
public class AgeSorter implements Comparator<Employee> 
{
    @Override
    public int compare(Employee o1, Employee o2) {
        return o2.getDob().compareTo(o1.getDob());
    }
}

比较器按 id 对员工列表进行排序。

import java.util.Comparator;
public class IdSorter implements Comparator<Employee> 
{
    @Override
    public int compare(Employee o1, Employee o2) {
        return o2.getId().compareTo(o1.getId());
    }
}

ArrayList sort()方法 示例

现在让我们使用比较器类按姓名对员工列表进行排序。

import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
public class ArrayListExample 
{
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        ArrayList<Employee> employees = new ArrayList<>();

        employees.add(new Employee(1l, "JackLi", LocalDate.of(2018, Month.APRIL, 21)));
        employees.add(new Employee(4l, "BobRobert", LocalDate.of(2018, Month.APRIL, 22)));
        employees.add(new Employee(3l, "Tomm", LocalDate.of(2018, Month.APRIL, 25)));
        employees.add(new Employee(5l, "Lucie", LocalDate.of(2018, Month.APRIL, 23)));
        employees.add(new Employee(2l, "Edwin", LocalDate.of(2018, Month.APRIL, 24)));

        employees.sort(new NameSorter());
        System.out.println(employees);
    }
}

程序输出。

[
Employee [id=1, name=JackLi, dob=2018-04-21], 
Employee [id=4, name=BobRobert, dob=2018-04-22], 
Employee [id=3, name=Tomm, dob=2018-04-25], 
Employee [id=5, name=Lucie, dob=2018-04-23], 
Employee [id=2, name=Edwin, dob=2018-04-24]]

现在让我们使用比较器类对 age 列表进行排序。

import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
public class ArrayListExample 
{
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        ArrayList<Employee> employees = new ArrayList<>();

        employees.add(new Employee(1l, "JackLi", LocalDate.of(2018, Month.APRIL, 21)));
        employees.add(new Employee(4l, "BobRobert", LocalDate.of(2018, Month.APRIL, 22)));
        employees.add(new Employee(3l, "Tomm", LocalDate.of(2018, Month.APRIL, 25)));
        employees.add(new Employee(5l, "Lucie", LocalDate.of(2018, Month.APRIL, 23)));
        employees.add(new Employee(2l, "Edwin", LocalDate.of(2018, Month.APRIL, 24)));

        employees.sort(new AgeSorter());
        System.out.println(employees);
    }
}

程序输出。

[
Employee [id=1, name=JackLi, dob=2018-04-21], 
Employee [id=4, name=BobRobert, dob=2018-04-22], 
Employee [id=5, name=Lucie, dob=2018-04-23], 
Employee [id=2, name=Edwin, dob=2018-04-24], 
Employee [id=3, name=Tomm, dob=2018-04-25]]

ArrayList sort() 方法

sort() 方法接受一个 Comparator实现类的实例,它必须能够比较包含在数组列表中的元素。

在内部,sort()方法使用Arrays.sort()方法对列表中的元素进行比较和排序。

public void sort(Comparator<? super E> c) 
{
    final int expectedModCount = modCount;
    Arrays.sort((E[]) elementData, 0, size, c);
    if (modCount != expectedModCount) {
        throw new ConcurrentModificationException();
    }
    modCount++;
}

方法参数 Comparator 实现。

方法返回 void

如果列表被修改而 sort()方法未完成,则该方法抛出 ConcurrentModificationException

日期:2020-09-17 00:09:57 来源:oir作者:oir