Comparator Trong Java

Comparator Trong Java

Các lập trình viên thường xuyên cần sắp xếp các phần tử từ cơ sở dữ liệu vào một collection, array, or map. Trong Java, chúng chúng ta có thể thực hiện bất kỳ thuật toán sắp xếp nào chúng chúng ta muốn với bất kỳ loại nào.

Sử dụng Comparable interface và compareTo(), chúng chúng ta có thể sắp xếp bằng thứ tự chữ cái, độ dài chuỗi, thứ tự chữ cái ngược hoặc số. Comparator interface cho phép chúng chúng ta làm tương tự nhưng theo cách linh hoạt hơn.

I. Comparator Trong Java Là Gì

Giao diện Comparator trong Java được dùng để sắp xếp các đối tượng của lớp do người dùng định nghĩa (user-defined). Giao diện này thuộc về gói Java.util và chứa 2 phương thức có tên compare(Object obj1,Object obj2) và equals(Object element).

Chúng chúng ta có thể sắp xếp các phần tử của:

  • Những đối tượng String.
  • Những đối tượng của lớp Wrapper.
  • Những đối tượng của lớp do người dùng định nghĩa (User-defined).

Giả sử chúng chúng ta có một mảng thuộc chứa các Student object có các thuộc tính như rollno, name, address, DOB v.v. và chúng chúng ta cần sắp xếp mảng dựa trên Rollno hoặc name?

Phương pháp 1: Một cách tiếp cận rõ ràng là viết hàm sort () của riêng chúng chúng ta bằng cách dùng 1 trong các thuật toán tiêu chuẩn. Thế nhưng giải pháp này yêu cầu chúng chúng ta phải triển khai lại các thuật toán rất dài dòng.

Phương pháp 2: Sử dụng Comparator interface để định nghĩa cách so sánh giữa 2 Student object với nhau. Sau đó chúng chúng ta có thể sử dụng Collections.sort() được cung cấp sẵn, method này cần nhận vào 1 Comparator Object được sử dụng trong quá trình nó chạy thuật toán sắp xếp đã được định nghĩa sẵn.

II. Phương Thức Compare()

Phương thức so sánh () được sử dụng để thực hiện sắp xếp tự nhiên trên chuỗi. Sắp xếp tự nhiên có nghĩa là thứ tự sắp xếp sử dụng trên đối tượng, ví dụ: thứ tự từ vựng cho Chuỗi, thứ tự số để Sắp xếp số nguyên, v.v.

Thứ tự từ vựng không có gì ngoài thứ tự chữ cái. Các phương thức so sánh thực hiện so sánh tuần tự các chữ cái trong chuỗi có cùng vị trí.

so sánh được định nghĩa trong giao diện java.lang.Comparable

Cú pháp :

public int compareTo(String str)

Thông số đầu vào:

str – Phương thức này chỉ chấp nhận một kiểu dữ liệu Chuỗi đầu vào.

Phương thức trả về:

Phương thức Java này trả về một kiểu dữ liệu int dựa trên so sánh từ vựng giữa hai chuỗi.

  • trả về <0 thì chuỗi gọi phương thức là từ vựng trước tiên
  • trả về == 0 thì hai chuỗi tương đương về mặt từ vựng
  • trả về> 0 thì tham số được truyền cho phương thức so sánh trước tiên là từ vựng.

III. Lớp Collections Trong Java

Collections là 1 tập các lớp dùng để lưu trữ danh sách và có khả năng tự co dãn khi danh sách đó thay đổi, ví dụ như khi chúng chúng ta thêm, sửa, xóa, chèn phần tử trong danh sách đó. Ngoài ra, Collections còn được dùng để lưu trữ, truy xuất, tương tác với dữ liệu và truyền dữ liệu giữa các phương thức với nhau (chi tiết về phương thức Techacademy sẽ giới thiệu trong chương Lập trình hướng đối tượng).

1 đặc điểm rất quan trong là khi sử dụng Collections đó là chúng chúng ta không cần phải khai báo trước số lượng phần tử. Chính đặc điểm này đã khắc phục được hạn chế về kích thước khi khai báo mảng trong Java.

Các điểm quan trọng về lớp Collections trong java là:

– Lớp Collections hỗ trợ các thuật toán đa hình (polymorphic algorithms) hoạt động trên các collection.

– Lớp Collections ném 1 ngoại lệ NullPointerException nếu các collection hoặc các đối tượng lớp cung cấp cho chúng là null.

Các thuộc tính của lớp Collections

– schúng tatic List EMPTY_LIST: khởi tạo 1 danh sách trống, không thể thay đổi (immuchúng table).

– schúng tatic Map EMPTY_MAP: khởi tạo 1 map trống, không thể thay đổi (immuchúng table).

– schúng tatic Set EMPTY_SET: khởi tạo 1 tập hợp trống, không thể thay đổi (immuchúng table).

IV. Phương Thức Của Lớp Collections Để Sắp Xếp Các Phần Tử Của List

Trong java thay vì phải sắp xếp các danh sách thủ công theo các thuật toán sắp xếp nổi bật, hoặc sắp xếp chọn… chúng ta có thể sử dụng sẵn phương thức của Collections

Sắp xếp trong collection

Thực ra việc sắp xếp trong collection của java là 1 vấn đề rất cũ, nhưng thường trong các câu hỏi phỏng vấn về java ứng viên rất hay bị hỏi về vấn đề này. Vì vậy mình mong post này sẽ giúp được một số ứng viên chẳng may bị hỏi đến lúc phỏng vấn . Lớp Collections cung cấp các phương thức tĩnh (static) cho việc sắp xếp các phần tử của collection. Chúng ta có thể sắp xếp các phần tử của:

– String objects

– Wrapper class objects

– Người dùng tự định nghĩa(User-defined) class objects

Phương thức của Collections class dùng cho việc sắp xếp các phần tử của List:

– public void sort(List list): được sử dụng để sắp xếp các phần tử của List. Các phần tử của List phải là kiểu Comparable.

Note: String class và Wrapper classes implements Comparable interface vì thế nên mặc định là nó có thể sắp xếp được.

Ví dụ về sắp xếp List chứa các đối tượng String

import java.util.*;

class TestSort1 {
   public schúng tatic void main(String args[]) {

      ArrayList<String> al = new ArrayList<String>();
      al.add("Peter");
      al.add("John");
      al.add("Marry");
      al.add("Andrew");

      Collections.sort(al);
      Iterator itr = al.iterator();
      while (itr.hasNext()) {
         System.out.println(itr.next());
      }
   }
}
Andrew
John
Marry
Peter

Ví dụ về sắp xếp List chứa các đối tượng Wrapper

import java.util.*;

class TestSort2 {
   public schúng tatic void main(String args[]) {

      ArrayList al = new ArrayList();
      al.add(Integer.valueOf(201));
      al.add(Integer.valueOf(101));
      al.add(230);// nó sẽ được convert thành Integer.valueOf(230)

      Collections.sort(al);

      Iterator itr = al.iterator();
      while (itr.hasNext()) {
         System.out.println(itr.next());
      }
   }
}
101
201
230

V. Ví Dụ Về Comparator Trong Java

Interface Comparator được sử dụng để chỉ ra thứ tự của những đối tượng do người dùng tự định nghĩa (User defined) Comparatoe định nghĩa 2 phương thức chính là compare(Object obj1, Object obj2) và equals(Object element). Nó cung cấp nhiều trình tự sắp xếp ví dụ nhưbạn có thể sắp xếp những phần tử của đối tượng Employee theo id, name, age, …

class Employee {
 int id;
 String name;
 short age;
 Employee(int id, String name, short age) {
 this.id = id;
 this.name = name;
 this.age = age;
 }
}
class AgeComparator implements Comparator<Employee> {
 public int compare(Employee emp1, Employee emp2) {
 if (emp1.age == emp2.age)
 return 0;
 else if (emp1.age > emp2.age)
 return 1;
 else
 return -1;
 }
}
class NameComparator implements Comparator<Employee> {
 public int compare(Employee emp1, Employee emp2) {
 return emp1.name.compareTo(emp2.name);
 }
}
class IdComparator implements Comparator<Employee> {
 public int compare(Employee emp1, Employee emp2) {
 if (emp1.id == emp2.id)
 return 0;
 else if (emp1.id > emp2.id)
 return 1;
 else
 return -1;
 }
}
class TestSortComparator {
 public static void main(String args[]) {
 ArrayList<Employee> al = new ArrayList<Employee>();
 al.add(new Employee(103, "Phong", (short) 18));
 al.add(new Employee(102, "Minh", (short) 20));
 al.add(new Employee(101, "Ninh", (short) 19));
 System.out.println("Sắp xếp theo thuộc tính name:");
 Collections.sort(al, new NameComparator());
 for (Employee st : al) {
 System.out.println(st.id + " " + st.name + " " + st.age);
 }
 System.out.println("Sắp xếp theo thuộc tính age:");
 Collections.sort(al, new AgeComparator()); 


    Z 0986589410 Email  
≡ ≡
5/6
« Prev Next »
 for (Employee st : al) {
 System.out.println(st.id + " " + st.name + " " + st.age);
 }
 System.out.println("Sắp xếp theo thuộc tính id:");
 Collections.sort(al, new IdComparator());
 for (Employee st : al) {
 System.out.println(st.id + " " + st.name + " " + st.age);
 }
 }
}

Kết quả:

Sắp xếp theo thuộc tính name:
102 Minh 20
101 Ninh 19
103 Phong 18
Sắp xếp theo thuộc tính age:
103 Phong 18
101 Ninh 19
102 Minh 20
Sắp xếp theo thuộc tính id:
101 Ninh 19
102 Minh 20
103 Phong 18

VI. Comparable Và Comparator Trong Java

Java cung cấp 2 giao diện để sắp xếp các đối tượng bằng cách dùng các thành viên dữ liệu của lớp:

  • Comparable
    Comparator

Khác nhau giữa Comparable và Comparator

Comparable Comparator
1 Phải implements giao tiếp Comparable cho lớp đối tượng cần được so sánh. Không phải implements giao tiếp Comparator cho lớp đối tượng cần được so sánh
2 Comparable cung cấp phương thức compareTo() để sắp xếp các phần tử. Comparator cung cấp phương thức compare() để sắp xếp các phần tử.
3 Comparable thuộc về java.lang package Comparator thuộc về java.util package
4 Có thể sắp xếp các phần tử của kiểu Comparable bởi phương thức Collections.sort(List). Có thể sắp xếp các phần tử của kiểu Comparator bởi phương thức Collections.sort(List, Comparator).

Như vậy mọi người đã có cái nhìn rõ ràng về Comparable và Comparator trong Java. Tùy vào từng trường hợp và yêu cầu của bài toán mà mọi người sẽ cân nhắc sử dụng Comparable hay Comparator một cách hợp lý và linh hoạt.

Bài viết liên quan

Leave a Reply

Your email address will not be published. Required fields are marked *

Hotline: 0984.876.750
Chat Facebook
Gọi điện ngay