Sắp xếp nâng cao trong ArrayList với ví dụ cụ thể

Trong lập trình đôi lúc chúng ta có một ArrayList object gồm nhiều thuộc tính khác nhau và chúng ta cần sắp xếp theo một hoặc nhiều thuộc tính chứa trong object. Vậy phải làm thế nào đây? Chúng ta sẽ cùng thảo luận trong bài này nha.

Ví dụ: Cho class Staff có chứa các thuộc tính sau: Tên- String, ngày sinh – LocalDate, Lương – double, level – int, Quê quán – String. 

Chúng ta có class Staff được sử dụng cho các ví dụ sau:

import java.time.LocalDate;

public class Staff {
    private String name;
    private LocalDate dateOfBirth;
    private double salary;
    private int level;
    private String homeTown;

    public Staff(String name, LocalDate dateOfBirth, double salary, int level, String homeTown) {
        this.name = name;
        this.dateOfBirth = dateOfBirth;
        this.salary = salary;
        this.level = level;
        this.homeTown = homeTown;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalDate getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(LocalDate dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public String getHomeTown() {
        return homeTown;
    }

    public void setHomeTown(String homeTown) {
        this.homeTown = homeTown;
    }

    @Override
    public String toString() {
        return "Staff{" +
                "name='" + name + '\'' +
                ", dateOfBirth=" + dateOfBirth +
                ", salary=" + salary +
                ", level=" + level +
                ", homeTown='" + homeTown + '\'' +
                '}';
    }
}

Cho một ArrayList chứa các Staff được khởi tạo sẵn

import java.time.LocalDate;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        List<Staff> staffs = new ArrayList<>();
        staffs.add(new Staff("a", LocalDate.of(1996, 1,1), 14.5, 1, "DN"));
        staffs.add(new Staff("f", LocalDate.of(2012, 2,1), 50.0, 2, "BH"));
        staffs.add(new Staff("g", LocalDate.of(1994, 3,1), 100.6, 4, "SG"));
        staffs.add(new Staff("h", LocalDate.of(1992, 3,4), 70.4, 3, "BD"));
        staffs.add(new Staff("h", LocalDate.of(1995, 1,5), 70.4, 3, "KG"));
        staffs.add(new Staff("w", LocalDate.of(1997, 8,6), 30.5, 2, "KH"));
        staffs.add(new Staff("o", LocalDate.of(2000, 2,19), 800.0, 8, "CM"));
        staffs.add(new Staff("p", LocalDate.of(2001, 10,20), 650.56, 7, "BT"));
        // add more code
    }

}

Note:

  • Với các ví dụ sau, code sẽ được thay thế bởi comment add more code ở hàm main
  • Chúng ta sẽ sử dụng method sort() của ArrayListCollections để tiến hành các ví dụ trong bài này.

Sắp xếp ArrayList theo một thuộc tính

Ví dụ: Sắp xếp Staff theo mức lương

Sắp xếp tăng dần

staffs.sort(((o1, o2) -> Double.compare(o1.getSalary(), o2.getSalary())));

// Or method of Collections
Collections.sort(staffs, (o1, o2) -> Double.compare(o1.getSalary(), o2.getSalary()));

staffs.forEach(staff -> System.out.println(staff.toString()));

Or comparator

staffs.sort(Comparator.comparingDouble(Staff::getSalary));

// Or method of Collections
Collections.sort(staffs, Comparator.comparingDouble(Staff::getSalary));

staffs.forEach(staff -> System.out.println(staff.toString()));

Output: 

Staff{name=’a’, dateOfBirth=1996-01-01, salary=14.5, level=1, homeTown=’DN’}
Staff{name=’w’, dateOfBirth=1997-08-06, salary=30.5, level=2, homeTown=’KH’}
Staff{name=’a’, dateOfBirth=2012-02-01, salary=50.0, level=2, homeTown=’BH’}
Staff{name=’h’, dateOfBirth=1992-03-04, salary=70.4, level=3, homeTown=’BD’}
Staff{name=’h’, dateOfBirth=1995-01-05, salary=70.4, level=3, homeTown=’KG’}
Staff{name=’g’, dateOfBirth=1994-03-01, salary=100.6, level=4, homeTown=’SG’}
Staff{name=’p’, dateOfBirth=2001-10-20, salary=650.56, level=7, homeTown=’BT’}
Staff{name=’w’, dateOfBirth=2000-02-19, salary=800.0, level=8, homeTown=’CM’}

Sắp xếp giảm dần

staffs.sort(((o1, o2) -> Double.compare(o2.getSalary(), o1.getSalary())));

// Or method of Collections
Collections.sort(staffs, ((o1, o2) -> Double.compare(o2.getSalary(), o1.getSalary())));

staffs.forEach(staff -> System.out.println(staff.toString()));

Or comparator

staffs.sort((Comparator.comparingDouble(Staff::getSalary).reversed()));

// Or method of Collections
Collections.sort(staffs, Comparator.comparingDouble(Staff::getSalary).reversed());

staffs.forEach(staff -> System.out.println(staff.toString()));

Output:

Staff{name=’w’, dateOfBirth=2000-02-19, salary=800.0, level=8, homeTown=’CM’}
Staff{name=’p’, dateOfBirth=2001-10-20, salary=650.56, level=7, homeTown=’BT’}
Staff{name=’g’, dateOfBirth=1994-03-01, salary=100.6, level=4, homeTown=’SG’}
Staff{name=’h’, dateOfBirth=1992-03-04, salary=70.4, level=3, homeTown=’BD’}
Staff{name=’h’, dateOfBirth=1995-01-05, salary=70.4, level=3, homeTown=’KG’}
Staff{name=’a’, dateOfBirth=2012-02-01, salary=50.0, level=2, homeTown=’BH’}
Staff{name=’w’, dateOfBirth=1997-08-06, salary=30.5, level=2, homeTown=’KH’}
Staff{name=’a’, dateOfBirth=1996-01-01, salary=14.5, level=1, homeTown=’DN’}

Sắp xếp ArrayList theo nhiều thuộc tính

Ví dụ: Sắp xếp các Staff  theo name và level, mức độ ưu tiên sắp xếp name -> level. 

Sắp xếp tăng dần

staffs.sort((Comparator.comparing(staff -> ((Staff)staff).getName())
                .thenComparingInt(staff -> ((Staff)staff).getLevel())));

// Or method of Collections
Collections.sort(staffs, Comparator.comparing(staff -> ((Staff)staff).getName())
                .thenComparingInt(staff -> ((Staff)staff).getLevel()));


staffs.forEach(staff -> System.out.println(staff.toString()));

Output:

Staff{name=’a’, dateOfBirth=1996-01-01, salary=14.5, level=1, homeTown=’DN’}
Staff{name=’a’, dateOfBirth=2012-02-01, salary=50.0, level=2, homeTown=’BH’}
Staff{name=’g’, dateOfBirth=1994-03-01, salary=100.6, level=4, homeTown=’SG’}
Staff{name=’h’, dateOfBirth=1992-03-04, salary=70.4, level=3, homeTown=’BD’}
Staff{name=’h’, dateOfBirth=1995-01-05, salary=70.4, level=3, homeTown=’KG’}
Staff{name=’p’, dateOfBirth=2001-10-20, salary=650.56, level=7, homeTown=’BT’}
Staff{name=’w’, dateOfBirth=1997-08-06, salary=30.5, level=2, homeTown=’KH’}
Staff{name=’w’, dateOfBirth=2000-02-19, salary=800.0, level=8, homeTown=’CM’}

Sắp xếp giảm dần 

staffs.sort((Comparator.comparing(staff -> ((Staff)staff).getName())
                .thenComparingInt(staff -> ((Staff)staff).getLevel())).reversed());

// Or method of Collections
Collections.sort(staffs, Comparator.comparing(staff -> ((Staff)staff).getName())
                .thenComparingInt(staff -> ((Staff)staff).getLevel()).reversed());

staffs.forEach(staff -> System.out.println(staff.toString()));

Output:

Staff{name=’w’, dateOfBirth=2000-02-19, salary=800.0, level=8, homeTown=’CM’}
Staff{name=’w’, dateOfBirth=1997-08-06, salary=30.5, level=2, homeTown=’KH’}
Staff{name=’p’, dateOfBirth=2001-10-20, salary=650.56, level=7, homeTown=’BT’}
Staff{name=’h’, dateOfBirth=1992-03-04, salary=70.4, level=3, homeTown=’BD’}
Staff{name=’h’, dateOfBirth=1995-01-05, salary=70.4, level=3, homeTown=’KG’}
Staff{name=’g’, dateOfBirth=1994-03-01, salary=100.6, level=4, homeTown=’SG’}
Staff{name=’a’, dateOfBirth=2012-02-01, salary=50.0, level=2, homeTown=’BH’}
Staff{name=’a’, dateOfBirth=1996-01-01, salary=14.5, level=1, homeTown=’DN’}

Sắp xếp ArrayList theo nhiều cấp

Các thuộc tính trong object có thể là một object khác. Chúng ta sẽ tìm hiểu xem sắp xếp ArrayList nhiều cấp qua ví dụ sau

Ví dụ: Sắp xếp tăng dần các Staff theo năm sinh.

Trong đây, ngày sinh của Staff là một LocalDate gồm ngày, tháng năm. chúng ta chỉ sắp xếp theo năm, bỏ qua ngày và tháng.

staffs.sort(Comparator.comparing(staff -> staff.getDateOfBirth().getYear()));

// Or method of Collections
Collections.sort(staffs, Comparator.comparing(staff -> staff.getDateOfBirth().getYear()));

staffs.forEach(staff -> System.out.println(staff.toString()));

Output:

Staff{name=’h’, dateOfBirth=1992-03-04, salary=70.4, level=3, homeTown=’BD’}
Staff{name=’g’, dateOfBirth=1994-03-01, salary=100.6, level=4, homeTown=’SG’}
Staff{name=’h’, dateOfBirth=1995-01-05, salary=70.4, level=3, homeTown=’KG’}
Staff{name=’a’, dateOfBirth=1996-01-01, salary=14.5, level=1, homeTown=’DN’}
Staff{name=’w’, dateOfBirth=1997-08-06, salary=30.5, level=2, homeTown=’KH’}
Staff{name=’w’, dateOfBirth=2000-02-19, salary=800.0, level=8, homeTown=’CM’}
Staff{name=’p’, dateOfBirth=2001-10-20, salary=650.56, level=7, homeTown=’BT’}
Staff{name=’a’, dateOfBirth=2012-02-01, salary=50.0, level=2, homeTown=’BH’}

‹Previous Next›

0 0 votes
Article Rating
Subscribe
Notify of
guest
2 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
2
0
Would love your thoughts, please comment.x
()
x