Trong Java, để kiểm tra xem hai đối tượng có giống nhau hay không, chúng ta thường sử dụng phương thức equals() để làm điều này! Còn để so sánh và sắp xếp hai đối tượng trong một mảng hoặc một danh sách nào đó, chúng ta có thể sử dụng interface Comparable. Trong bài viết này, mình sẽ nói rõ hơn về interface này để các bạn hiểu rõ hơn nhé!
OK, bắt đầu nào các bạn.
Interface Comparable là một generic interface, được sử dụng để sắp xếp các đối tượng mà class của chúng hiện thực interface này.
Ví dụ như mình có một đối tượng Student như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com.huongdanjava.comparable; public class Student { private int code; private String name; public Student(int code, String name) { this.code = code; this.name = name; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
Bây giờ, mình muốn sắp xếp các đối tượng Student này trong một mảng nào đó thì điều đầu tiên mình cần phải làm là hiện thực interface Comparable cho đối tượng Student, như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.comparable; public class Student implements Comparable<Student> { private int code; private String name; public Student(int code, String name) { this.code = code; this.name = name; } // Getter and Setter } |
Khi hiện thực interface này, chúng ta bắt buộc phải định nghĩa phương thức:
1 |
public int compareTo(Object other); |
để so sánh đối tượng này với đối tượng được truyền trong tham số của phương thức. Nội dung của phương thức do chúng ta tự định nghĩa nhưng bắt buộc phải trả về các giá trị như sau: số âm, 0 và số dương.
Số âm thì có nghĩa đối tượng này nhỏ hơn đối tượng được truyền trong tham số của phương thức, 0 có nghĩa là hai đối tượng bằng nhau còn số dương thì có nghĩa là đối tượng này lớn hơn.
Với đối tượng Student trong ví dụ trên thì mình có thể định nghĩa phương thức compareTo(Object other) như sau:
1 2 3 4 5 6 7 8 9 |
public int compareTo(Student o) { if (this.getCode() > o.getCode()) { return 1; } if (this.getCode() < o.getCode()) { return -1; } return 0; } |
OK, về interface Comparable các bạn chỉ cần nắm những điều ở trên là đủ rồi đấy các bạn! Bây giờ, để thấy nó hoạt động như thế nào, mình sẽ sử dụng đối tượng Student ở trên để làm một ví dụ xem sao.
Trong ví dụ này, mình sẽ sử dụng đối tượng TreeSet để chứa vài đối tượng Student. Bởi vì, đối tượng TreeSet chứa các phần tử dưới dạng đã được sắp xếp, nên khi các bạn thêm mới các đối tượng Student ở trên thì nó sẽ tự động sắp xếp lại các đối tượng này luôn.
Code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.huongdanjava.comparable; import java.util.Iterator; import java.util.TreeSet; public class TestComparable { public static void main(String args[]) { TreeSet<Student> students = new TreeSet<Student>(); students.add(new Student(21, "Khanh")); students.add(new Student(26, "Tan")); students.add(new Student(24, "Phuong")); Iterator<Student> iterator = students.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next().getCode()); } } } |
Kết quả: