Sắp xếp theo nhiều tiêu chí Collection trong Java

Em có một lớp SinhVien(String maSV, String tenSV, int diem)

Em dùng một ArrayList chứa danh sách Sinh viên này
Sắp xếp List này theo tên thì em làm như sau:

public void sapXep() {
    Collections.sort(dsSV, new Comparator<SinhVien>() {
        @Override
        public int compare(SinhVien sv1, SinhVien sv2) {
            return  sv1.getTenSV().compareTo(sv2.getTenSV());
        }
    });
}

Nhưng giờ em muốn săp xếp mảng này theo 2 tiêu chí đồng thời đó là theo cả tên và điểm
Tức là theo điểm trước cùng điểm thì sắp theo tên

Trần văn A 10
Trần văn B 10
Trần văn C 10
Lê văn D 9
trần văn E 9

Vậy phải làm sao? Mong các anh chị có kinh nghiệm giúp em. Em cảm ơn ạ!

sv1.getTenSV().compareTo(sv2.getTenSV()) && sv1.diemSV().compareTo(sv2.diemSV())

như thế này chắc OK, thử xem :smiley:

1 Like

Bạn rất giống ý tưởng mình, nhưng không được hic

thử vậy:

rs = sv1.diemSV().compareTo(sv2.diemSV()
if (rs == 0) {
 return  sv1.getTenSV().compareTo(sv2.getTenSV());
} else {
 return rs;
}

ref : http://stackoverflow.com/questions/6850611/sort-a-list-of-objects-by-multiple-fields

1 Like

Cảm ơn bạn mình đã thành công :smiley:

2 Likes

Nếu có tới 5 thuộc tính thì sắp kiểu gì nhỉ?

Cũng tượng tự như 2 thôi, if-esle hơi nhiều tý, trong link ở trên nó compare 3 field đó, có một số thư viện hỗ trở ngắn hơn ref: http://blog.projectnibble.org/2013/06/21/ways-to-sort-lists-of-objects-in-java-based-on-multiple-fields/

2 Likes

Java 8 Lambda Expression:

Collections.sort(dsSV, (sv1, sv2) -> sv1.getTenSV().compareTo(sv2.getTenSV()) && sv1.getDiem().compareTo(sv2.getDiem()));

Vậy nếu mình muốn viết thêm 1 method để sắp xếp theo điều kiện khác nữa thì sao các bạn? Override 2 lần thì nó mất lần đầu rồi…

Bạn đưa điều kiện đấy ra đây.

Ví dụ 1 danh sách gồm giảng viên cơ hữu và giảng viên bán cơ hữu. Đầu tiên là sắp xếp danh sách gv cơ hữu làm việc trên 10 năm, sau đó lại sắp xếp giảng viên bán cơ hữu có học vị từ tiến sĩ trở lên…

Bạn search Java Lambda Expression rồi tự học và áp dụng vào trường hợp của bạn nhé. Nếu không thì làm theo cách cổ điển là dùng Comparator là ok.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?