Bài 17: Sắp xếp các đối tượng trong ArrayList

Trong thực tế khi lập trình, công việc sắp xếp 1 danh sách các đối tượng phải áp dụng rất nhiều. Ví dụ:
– Sắp xếp họ tên theo thứ tự a, b, c.
– Sắp xếp danh sách kết quả thi theo thứ tự từ cao xuống thấp.
– Sắp xếp tài liệu theo thứ tự mới trước, cũ sau.
– ..v.v..

– Việc sắp xếp một các đối tượng trong 1 ArrayList có thể có nhiều cách. Các bạn có thể áp dụng các phương pháp cơ bản, hoán đổi vị trí khi so sánh giống như việc sắp xếp các phần tử trong mảng đã dùng. Tuy nhiên, ở bài này mình sẽ giới thiệu 1 cách sắp xếp cực ngắn gọn, Java đã hỗ trợ sẵn, đó là phương thức sắp xếp Collection.sort.
– Mình sẽ nêu một vài ví dụ cụ thể để các bạn cùng tìm hiểu!
Ở các ví dụ này, các thuộc tính đối tượng mình để public cho ngắn gọn, chúng ta tập trung vào đoạn sắp xếp!

Ví dụ 1: Sắp xếp một danh sách các đối tượng sinh viên có 2 thuộc tính họ tên và điểm thi.
Các bạn chú ý đoạn này:

//Sắp xếp danh sách theo theo số điểm giảm dần!
        Collections.sort(danhSach, new Comparator<SinhVien>() {
            @Override
            public int compare(SinhVien sv1, SinhVien sv2) {
                if (sv1.diem < sv2.diem) {
                    return 1;
                } else {
                    if (sv1.diem == sv2.diem) {
                        return 0;
                    } else {
                        return -1;
                    }
                }
            }
        });

– Trên là cách sử dụng phương thức Collections.sort với danhSach là một đối tượng ArrayList, bên trong chứa danh sách các đối tượng SinhVien
– Phương thức public int compare(SinhVien sv1, SinhVien sv2) trả về kiểu giá trị nguyên. Đoạn code trên là giúp sắp xếp theo thứ tự giảm dần của số điểm từng đối tượng sinh viên. Nếu bạn muốn sắp xếp tăng dần thì đổi chỗ 1-1 cho nhau là được!

Collections.sort(danhSach, new Comparator<SinhVien>() {
            @Override
            public int compare(SinhVien sv1, SinhVien sv2) {
                if (sv1.diem < sv2.diem) {
                    return -1;
                } else {
                    if (sv1.diem == sv2.diem) {
                        return 0;
                    } else {
                        return 1;
                    }
                }
            }
        });

Toàn bộ code chương trình như sau

class SinhVien {
 
    public String hoTen;
    public int diem;
}
 
public class JavaAndroidVn {
 
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Nhập số sinh viên: ");
        int n = input.nextInt();
 
        ArrayList<SinhVien> danhSach = new ArrayList();
 
        for (int i = 0; i < n; i++) {
            input.nextLine();
            SinhVien x = new SinhVien();
            System.out.println("Thông tin sinh viên thứ " + i);
            System.out.print("Họ và Tên: ");
            x.hoTen = input.nextLine();
            System.out.print("Điểm: ");
            x.diem = input.nextInt();
            danhSach.add(x);
        }
 
        //Sắp xếp danh sách theo số điểm giảm dần!
        Collections.sort(danhSach, new Comparator<SinhVien>() {
            @Override
            public int compare(SinhVien sv1, SinhVien sv2) {
                if (sv1.diem < sv2.diem) {
                    return 1;
                } else {
                    if (sv1.diem == sv2.diem) {
                        return 0;
                    } else {
                        return -1;
                    }
                }
            }
        });
 
        System.out.println("Danh sách sắp xếp theo thứ tự điểm giảm dần là: ");
        for (int i = 0; i < danhSach.size(); i++) {
            System.out.println("Tên: " + danhSach.get(i).hoTen + " Điểm: " + danhSach.get(i).diem);
        }
    }
}

Ví dụ 2: Sắp xếp danh sách các đối tượng theo thứ tự trong bảng chữ cái! a b c

class SinhVien {
 
    public String hoTen;
    public int diem;
}
 
public class JavaAndroidVn {
 
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Nhập số sinh viên: ");
        int n = input.nextInt();
 
        ArrayList<SinhVien> danhSach = new ArrayList();
 
        for (int i = 0; i < n; i++) {
            input.nextLine();
            SinhVien x = new SinhVien();
            System.out.println("Thông tin sinh viên thứ " + i);
            System.out.print("Họ và Tên: ");
            x.hoTen = input.nextLine();
            System.out.print("Điểm: ");
            x.diem = input.nextInt();
            danhSach.add(x);
        }
 
        //Sắp xếp danh sách theo theo thứ tự a b c!
        Collections.sort(danhSach, new Comparator<SinhVien>() {
            @Override
            public int compare(SinhVien sv1, SinhVien sv2) {
                return (sv1.hoTen.compareTo(sv2.hoTen));
                // Muốn đảo danh sách các bạn đối thành
                //return (sv2.hoTen.compareTo(sv1.hoTen));
            }
        });
 
        System.out.println("Danh sách sắp xếp theo tên trong bảng chữ cái a - b - c: ");
        for (int i = 0; i < danhSach.size(); i++) {
            System.out.println("Tên: " + danhSach.get(i).hoTen + " Điểm: " + danhSach.get(i).diem);
        }
    }
}

 

Nguyễn Linh

Chia sẻ để cùng tiến bộ...