杰瑞科技汇

ArrayList如何排序?Java代码示例?

核心方法

  1. 使用 Collections.sort() (传统方法)
  2. 使用 List.sort() (Java 8+ 推荐)
  3. 使用 Stream.sorted() (Java 8+ 函数式风格)

使用 Collections.sort() (针对基本数据类型和可比较对象)

这是最传统、最基础的方法,它要求 ArrayList 中的元素必须是 可比较的,或者你需要提供一个自定义的 比较器

ArrayList如何排序?Java代码示例?-图1
(图片来源网络,侵删)

a) 对基本数据类型或实现了 Comparable 接口的对象进行排序

ArrayList 中的元素是基本数据类型的包装类(如 Integer, Double)或者实现了 Comparable 接口(如 String, Date),可以直接调用 Collections.sort()

示例:对 Integer 列表进行升序排序

import java.util.ArrayList;
import java.util.Collections;
public class SortArrayListExample {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(1);
        numbers.add(8);
        numbers.add(3);
        numbers.add(9);
        System.out.println("排序前: " + numbers);
        // 使用 Collections.sort() 进行升序排序
        Collections.sort(numbers);
        System.out.println("排序后 (升序): " + numbers);
    }
}

输出:

排序前: [5, 1, 8, 3, 9]
排序后 (升序): [1, 3, 5, 8, 9]

b) 使用自定义比较器 进行降序或复杂排序

如果你想进行降序排序,或者根据对象的某个自定义属性进行排序,你需要使用 Comparator

ArrayList如何排序?Java代码示例?-图2
(图片来源网络,侵删)

示例:对 Integer 列表进行降序排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class SortArrayListComparatorExample {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(1);
        numbers.add(8);
        numbers.add(3);
        numbers.add(9);
        System.out.println("排序前: " + numbers);
        // 使用 Collections.sort() 和 Comparator 进行降序排序
        // Comparator.reverseOrder() 是一个内置的比较器,用于实现自然顺序的逆序
        Collections.sort(numbers, Comparator.reverseOrder());
        System.out.println("排序后 (降序): " + numbers);
    }
}

输出:

排序前: [5, 1, 8, 3, 9]
排序后 (降序): [9, 8, 5, 3, 1]

示例:对自定义对象列表进行排序

假设我们有一个 Student 类,我们想根据学生的年龄进行排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
// 1. 定义 Student 类
class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}
// 2. 主程序
public class SortCustomObjectExample {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张三", 22));
        students.add(new Student("李四", 20));
        students.add(new Student("王五", 25));
        students.add(new Student("赵六", 21));
        System.out.println("排序前: " + students);
        // 方式一:使用匿名内部类创建 Comparator (Java 8 之前)
        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                // 按年龄升序排序
                return Integer.compare(s1.getAge(), s2.getAge());
            }
        });
        System.out.println("排序后 (按年龄升序): " + students);
    }
}

输出:

排序前: [Student{name='张三', age=22}, Student{name='李四', age=20}, Student{name='王五', age=25}, Student{name='赵六', age=21}]
排序后 (按年龄升序): [Student{name='李四', age=20}, Student{name='赵六', age=21}, Student{name='张三', age=22}, Student{name='王五', age=25}]

使用 List.sort() (Java 8+ 推荐)

从 Java 8 开始,List 接口本身增加了 sort() 方法,这个方法的行为和 Collections.sort() 几乎完全一样,但它直接在 List 实例上调用,代码更简洁,更符合面向对象的思想。

语法: list.comparator

示例:

import java.util.ArrayList;
import java.util.Comparator;
public class ListSortExample {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(1);
        numbers.add(8);
        System.out.println("排序前: " + numbers);
        // 使用 List.sort() 进行升序排序
        // null 参数表示使用自然顺序
        numbers.sort(null);
        System.out.println("排序后 (升序): " + numbers);
        // 使用 List.sort() 和 Comparator 进行降序排序
        numbers.sort(Comparator.reverseOrder());
        System.out.println("排序后 (降序): " + numbers);
    }
}

对自定义对象排序 (使用 Lambda 表达式):

List.sort() 结合 Java 8 的 Lambda 表达式,让代码非常简洁优雅。

import java.util.ArrayList;
import java.util.Comparator;
class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() { return name; }
    public int getAge() { return age; }
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + '}';
    }
}
public class LambdaSortExample {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张三", 22));
        students.add(new Student("李四", 20));
        students.add(new Student("王五", 25));
        System.out.println("排序前: " + students);
        // 使用 List.sort() 和 Lambda 表达式按年龄升序排序
        students.sort((s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()));
        System.out.println("排序后 (按年龄升序): " + students);
        // 使用方法引用 按年龄升序排序 (更简洁)
        // students.sort(Comparator.comparingInt(Student::getAge));
        // 按年龄降序排序
        students.sort((s1, s2) -> Integer.compare(s2.getAge(), s1.getAge()));
        // 或者
        // students.sort(Comparator.comparingInt(Student::getAge).reversed());
        System.out.println("排序后 (按年龄降序): " + students);
    }
}

Lambda 表达式 (s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()) 等价于匿名内部类,但代码量大大减少。


使用 Stream.sorted() (Java 8+ 函数式风格)

如果你不打算原地修改 ArrayList,而是想创建一个新的已排序列表,Stream 是一个很好的选择。Stream.sorted() 方法返回一个新的 Stream,你需要将其收集回一个 List

语法: list.stream().sorted(comparator).collect(Collectors.toList())

示例:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class StreamSortExample {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(1);
        numbers.add(8);
        System.out.println("原始列表: " + numbers);
        // 使用 Stream.sorted() 创建一个新的升序列表
        // 原始列表 numbers 保持不变
        List<Integer> sortedNumbers = numbers.stream()
                                              .sorted() // 自然排序
                                              .collect(Collectors.toList());
        System.out.println("新排序列表 (升序): " + sortedNumbers);
        System.out.println("原始列表未改变: " + numbers);
        // 使用 Stream.sorted() 和 Comparator 创建一个新的降序列表
        List<Integer> reverseSortedNumbers = numbers.stream()
                                                    .sorted(Comparator.reverseOrder())
                                                    .collect(Collectors.toList());
        System.out.println("新排序列表 (降序): " + reverseSortedNumbers);
    }
}

对自定义对象排序:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
class Student { /* ... 与上面相同的 Student 类 ... */ }
public class StreamCustomObjectSortExample {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张三", 22));
        students.add(new Student("李四", 20));
        students.add(new Student("王五", 25));
        System.out.println("排序前: " + students);
        // 使用 Stream.sorted() 和 Lambda 按年龄升序,创建新列表
        List<Student> sortedByAge = students.stream()
                .sorted(Comparator.comparingInt(Student::getAge))
                .collect(Collectors.toList());
        System.out.println("新列表 (按年龄升序): " + sortedByAge);
    }
}

Comparator.comparingInt(Student::getAge) 是一个更强大的方法引用,专门用于根据 int 类型的属性进行比较,非常推荐使用。


总结与对比

方法 原地排序 适用场景 代码风格 备注
Collections.sort() Java 8 之前的代码,或需要兼容旧版本。 传统 静态工具方法。
List.sort() Java 8+ 推荐做法,原地排序时首选。 现代/面向对象 代码更简洁,直接在列表上调用。
Stream.sorted() 当你需要保留原始列表,并创建一个新的排序列表时。 函数式/链式调用 功能强大,可以与其他 Stream 操作(如 filter, map)组合使用。

如何选择?

  1. 如果你使用 Java 8 或更高版本,并且需要原地修改列表

    • 首选 list.sort(null) 进行自然排序。
    • 首选 list.sort(Comparator.comparing(...)) 进行复杂排序,这是最现代、最清晰的方式。
  2. 如果你需要保留原始列表,并创建一个新的排序列表

    • 使用 list.stream().sorted(...).collect(Collectors.toList()),这在函数式编程中非常常见。
  3. 如果你在维护一个旧的 Java 项目(Java 7 或更早)

    • 使用 Collections.sort(list)Collections.sort(list, comparator)

希望这个详细的解释能帮助你掌握 Java 中 ArrayList 的排序!

分享:
扫描分享到社交APP
上一篇
下一篇