Mục lục
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 ArrayList và Collections để 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’}