30/09/2018, 18:23

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 ạ!

Nguyen Ca viết 20:25 ngày 30/09/2018

sv1.getTenSV().compareTo(sv2.getTenSV())

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

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

PC viết 20:30 ngày 30/09/2018

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

Nguyen Ca viết 20:25 ngày 30/09/2018

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

PC viết 20:34 ngày 30/09/2018

rn rs;

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

huy vo viết 20:30 ngày 30/09/2018

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

Nguyen Ca viết 20:34 ngày 30/09/2018

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/

Nguyễn Hải Đăng viết 20:33 ngày 30/09/2018

Java 8 Lambda Expression:

Collections.sort(dsSV, (sv1, sv2) -> sv1.getTenSV().compareTo(sv2.getTenSV()) && sv1.getDiem().compareTo(sv2.getDiem()));
huy vo viết 20:39 ngày 30/09/2018

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…

Nguyễn Hải Đăng viết 20:30 ngày 30/09/2018

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

huy vo viết 20:39 ngày 30/09/2018

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…

Nguyễn Hải Đăng viết 20:36 ngày 30/09/2018

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.

Bài liên quan
0