Minh họa sắp xếp dữ liệu trong lập trình Java
Khi làm việc với dữ liệu trong Java, việc sắp xếp list trong Java là thao tác không thể thiếu để tổ chức thông tin theo thứ tự logic, giúp tìm kiếm và xử lý nhanh hơn. Java cung cấp nhiều công cụ tích hợp sẵn như Collections.sort(), List.sort() và Stream API để thực hiện việc này một cách hiệu quả. Đây là một phần quan trọng trong lý thuyết Java cơ bản mà mọi lập trình viên cần nắm vững.
Bài viết này sẽ hướng dẫn chi tiết 3 phương pháp chính để sắp xếp danh sách trong Java, kèm ví dụ thực tế và so sánh ưu nhược điểm để bạn chọn được cách phù hợp nhất với dự án của mình.
Sắp Xếp List Với Collections.sort()
Collections.sort() là phương pháp phổ biến nhất để sắp xếp list trong Java. Phương thức này sắp xếp các phần tử theo thứ tự tăng dần mặc định, áp dụng cho các kiểu dữ liệu có thể so sánh được như số nguyên, chuỗi.
Sắp xếp list số nguyên
import java.util.Collections; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { List numbers = new ArrayList(); numbers.add(3); numbers.add(1); numbers.add(4); numbers.add(2); Collections.sort(numbers); System.out.println("Sorted List: " + numbers); } }
Kết quả:
Sorted List: [1, 2, 3, 4]
Sắp xếp đối tượng tùy chỉnh với Comparator
Khi cần sắp xếp các đối tượng phức tạp theo tiêu chí riêng, bạn phải tạo một Comparator tùy chỉnh. Comparator là interface định nghĩa phương thức compare() để so sánh hai đối tượng, thể hiện tính đa hình trong lập trình hướng đối tượng.
import java.util.Collections; import java.util.List; import java.util.ArrayList; import java.util.Comparator; public class Main { public static void main(String[] args) { List people = new ArrayList(); people.add(new Person("Alice", 25)); people.add(new Person("Bob", 30)); people.add(new Person("Charlie", 20)); Collections.sort(people, new PersonComparator()); System.out.println("Sorted List: " + people); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public int getAge() { return age; } @Override public String toString() { return name + " (" + age + ")"; } } class PersonComparator implements Comparator { @Override public int compare(Person a, Person b) { return a.getAge() - b.getAge(); } }
Kết quả:
Sorted List: [Charlie (20), Alice (25), Bob (30)]
⚠️ Lưu ý: Khi sắp xếp theo nhiều tiêu chí, hãy xử lý từng điều kiện trong
compare()theo thứ tự ưu tiên. Ví dụ: sắp xếp theo tuổi trước, nếu bằng nhau thì sắp xếp theo tên.
Collections.sort() phù hợp khi bạn cần sắp xếp collection dựa trên một hoặc nhiều thuộc tính của đối tượng, đặc biệt trong các ứng dụng thương mại điện tử khi cần sắp xếp sản phẩm theo giá, đánh giá hoặc thương hiệu.
Sắp Xếp Với List.sort()
List.sort() là phương thức instance của interface List, được giới thiệu từ Java 8. Phương thức này sắp xếp trực tiếp trên list gốc mà không cần tạo bản sao.
import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List numbers = Arrays.asList(5, 3, 2, 4, 1); numbers.sort(null); System.out.println(numbers); } }
Kết quả:
[1, 2, 3, 4, 5]
Khi truyền null vào sort(), Java sử dụng thứ tự tự nhiên của các phần tử. Để sắp xếp theo tiêu chí khác, bạn có thể truyền vào một Comparator:
numbers.sort((a, b) -> b - a); // Sắp xếp giảm dần
List.sort() hiệu quả khi bạn muốn sắp xếp in-place (tại chỗ) mà không cần tạo collection mới. Phương pháp này tiết kiệm bộ nhớ và phù hợp với các list lớn.
Sắp Xếp Với Stream API
Stream API từ Java 8 cung cấp cách tiếp cận functional programming để xử lý collection. Phương thức sorted() trả về một stream mới với các phần tử đã được sắp xếp.
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List numbers = Arrays.asList(5, 3, 2, 4, 1); List sortedList = numbers.stream() .sorted() .collect(Collectors.toList()); System.out.println(sortedList); } }
Kết quả:
[1, 2, 3, 4, 5]
Stream API cho phép kết hợp nhiều thao tác trong một pipeline. Ví dụ, lọc và sắp xếp cùng lúc:
List filteredAndSorted = numbers.stream() .filter(n -> n > 2) .sorted() .collect(Collectors.toList());
⚠️ Lưu ý: Stream API tạo ra collection mới, không thay đổi collection gốc. Điều này an toàn hơn trong môi trường đa luồng nhưng tốn thêm bộ nhớ.
stream.sorted() phù hợp khi bạn cần kết hợp sắp xếp với các thao tác khác như filter, map, hoặc khi làm việc với dữ liệu từ nguồn stream như file hoặc database.
So Sánh 3 Phương Pháp
| Phương pháp | Ưu điểm | Nhược điểm | Khi nào dùng |
|---|---|---|---|
Collections.sort() |
Đơn giản, hỗ trợ Comparator tùy chỉnh | Chỉ dùng cho Collection | Sắp xếp collection theo tiêu chí phức tạp |
List.sort() |
Sắp xếp in-place, tiết kiệm bộ nhớ | Thay đổi list gốc | Sắp xếp list lớn, không cần giữ bản gốc |
stream.sorted() |
Kết hợp được với pipeline, immutable | Tốn bộ nhớ, chậm hơn với list nhỏ | Xử lý dữ liệu phức tạp, cần giữ nguyên list gốc |
Trong Java, sắp xếp list có thể thực hiện qua Collections.sort(), List.sort() hoặc Stream API. Lựa chọn phương pháp phụ thuộc vào yêu cầu cụ thể: Collections.sort() cho tính linh hoạt, List.sort() cho hiệu suất, và Stream API cho khả năng kết hợp với các thao tác khác.
Cập nhật lần cuối 14/03/2026 by Hiếu IT
