Phân biệt Comparable và Comparator trong Java

Comparable Comparator trong Java rất hữu ích để sắp xếp tập hợp các đối tượng. Ở bài viết này chúng ta sẽ tìm hiểu cách nó hoạt động, xem một số ví dụ và phân biệt chúng.

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

  1. Comparable
  2. Comparator

Sắp xếp sử dụng Comparable Interface

Một đối tượng comparable có khả năng so sánh chính nó với một đối tượng khác. Bản thân lớp phải implement inteface java.lang.Comparable để so sánh các thể hiện của nó. Hãy xem xét một lớp Movie có các thành viên như, xếp hạng, tên, năm. Giả sử chúng ta muốn sắp xếp một danh sách phim dựa trên năm phát hành. Chúng ta có thể triển khai như sau

1. Implement inteface java.lang.Comparable cho lớp Movie (Phim)

2. Ghi đè phương thức compareTo() của inteface java.lang.Comparable

 

 

import java.io.*;
import java.util.*;
 
class Movie implements Comparable<Movie>
{
    private double rating;
    private String name;
    private int year;
 
    public int compareTo(Movie m)
    {
        return this.year - m.year;
    }
 
    public Movie(String nm, double rt, int yr)
    {
        this.name = nm;
        this.rating = rt;
        this.year = yr;
    }
 
    public double getRating() { return rating; }
    public String getName()   {  return name; }
    public int getYear()      {  return year;  }
}
 
class Main
{
    public static void main(String[] args)
    {
        ArrayList<Movie> list = new ArrayList<Movie>();
        list.add(new Movie("Force Awakens", 8.3, 2015));
        list.add(new Movie("Star Wars", 8.7, 1977));
        list.add(new Movie("Empire Strikes Back", 8.8, 1980));
        list.add(new Movie("Return of the Jedi", 8.4, 1983));
 
        Collections.sort(list);
 
        System.out.println("Movies after sorting : ");
        for (Movie movie: list)
        {
            System.out.println(movie.getName() + " " +
                               movie.getRating() + " " +
                               movie.getYear());
        }
    }
}

Output: 

Movies after sorting : 

Star Wars 8.7 1977

Empire Strikes Back 8.8 1980

Return of the Jedi 8.4 1983

Force Awakens 8.3 2015

Bây giờ, giả sử chúng ta muốn phân loại phim theo xếp hạng và tên của chúng. Khi chúng ta làm cho một phần tử tập hợp có thể so sánh được (bằng cách trên), chúng ta chỉ có một cơ hội để triển khai phương thức compareTo (). Vì thế giải pháp bây giờ chính là sử dụng Comparator.

 
 

Sắp xếp sử dụng Comparator

Không giống như cách 1, Comparator nằm ngoài kiểu phần tử mà chúng ta đang so sánh. Đó là một lớp riêng biệt. Chúng ta sẽ tạo nhiều lớp riêng biệt (triển khai Comparator) để so sánh bởi các thành viên khác nhau. Lớp Collections có một phương thức sort () và nó sử dụng Comparator. Phương thức sort() gọi compare() để sắp xếp các đối tượng. Để áp dụng, chúng ta cần thực hiện 3 điều sau:
 

  1. Tạo 1 class implements Comparator
  2. Tạo một instance từ Comparator class đó
  3. Gọi hàm sort() của thư viện Collections, truyền vào đó danh sách cần sắp xếp và instance được tạo ở bước 2

import java.io.*;

import java.util.*;

 

class Movie implements Comparable<Movie>

{

    private double rating;

    private String name;

    private int year;

 

    public int compareTo(Movie m)

    {

        return this.year - m.year;

    }

 

    public Movie(String nm, double rt, int yr)

    {

        this.name = nm;

        this.rating = rt;

        this.year = yr;

    }

 

    public double getRating() { return rating; }

    public String getName()   {  return name; }

    public int getYear()      {  return year;  }

}

 

class RatingCompare implements Comparator<Movie>

{

    public int compare(Movie m1, Movie m2)

    {

        if (m1.getRating() < m2.getRating()) return -1;

        if (m1.getRating() > m2.getRating()) return 1;

        else return 0;

    }

}

 

class NameCompare implements Comparator<Movie>

{

    public int compare(Movie m1, Movie m2)

    {

        return m1.getName().compareTo(m2.getName());

    }

}

 

class Main

{

    public static void main(String[] args)

    {

        ArrayList<Movie> list = new ArrayList<Movie>();

        list.add(new Movie("Force Awakens", 8.3, 2015));

        list.add(new Movie("Star Wars", 8.7, 1977));

        list.add(new Movie("Empire Strikes Back", 8.8, 1980));

        list.add(new Movie("Return of the Jedi", 8.4, 1983));

 

        System.out.println("Sorted by rating");

        RatingCompare ratingCompare = new RatingCompare();

        Collections.sort(list, ratingCompare);

        for (Movie movie: list)

            System.out.println(movie.getRating() + " " +

                               movie.getName() + " " +

                               movie.getYear());

 

        System.out.println("\nSorted by name");

        NameCompare nameCompare = new NameCompare();

        Collections.sort(list, nameCompare);

        for (Movie movie: list)

            System.out.println(movie.getName() + " " +

                               movie.getRating() + " " +

                               movie.getYear());

 

        System.out.println("\nSorted by year");

        Collections.sort(list);

        for (Movie movie: list)

            System.out.println(movie.getYear() + " " +

                               movie.getRating() + " " +

                               movie.getName()+" ");

    }

Phân biệt Comparable và Comparator

Comparable giúp bản thân đối tượng phải biết nó được sắp xếp như thế nào. Trong khi, việc sắp xếp dùng Comparator được thực hiện thông qua một lớp riêng biệt.

Về mặt logic,Comparable tham chiếu “this” với đối tượng được chỉ định và Comparator so sánh hai đối tượng khác nhau được cung cấp. Nếu bất kỳ lớp nào triển khai Comparable trong Java thì tập hợp của đối tượng đó (ví dụ: Array, List) có thể được sắp xếp tự động bằng cách sử dụng phương thức Collections.sort() hoặc Arrays.sort() và các đối tượng sẽ được sắp xếp dựa trên thứ tự tự nhiên được xác định bởi phương thức compareTo().

Một đặc điểm khác biệt cơ bản là sử dụng so sánh, chúng ta chỉ có thể sử dụng một so sánh. Trong khi đó, ta có thể viết nhiều hơn một bộ so sánh tùy chỉnh cho một loại nhất định. Giống như trong ví dụ về Comparable, ta chỉ có thể sắp xếp theo một thuộc tính,  nhưng trong bộ so sánh, ta có thể sắp xếp theo các thuộc tính khác nhau như xếp hạng, tên và năm.

 

Tóm lại, nếu việc sắp xếp các đối tượng cần dựa trên thứ tự tự nhiên thì hãy sử dụng So sánh trong khi nếu bạn sắp xếp cần được thực hiện trên các thuộc tính của các đối tượng khác nhau, thì hãy sử dụng Bộ so sánh trong Java.


  RATE: 4.3 

  4478 VIEW


chưa có bình luận nào ...
BÀI VIẾT LIÊN QUAN
Quantum Computing là gì, ứng dụng của nó trong quantum computers

Công nghệ lượng tử khai thác một số hiện tượng gần như huyền bí của cơ học lượng tử để mang lại những bước tiến vượt bậc về sức mạnh xử lý. Máy lượng tử hứa hẹn sẽ vượt xa những siêu máy tính có khả năng xử lí tốt nhất hiện nay, hứa hẹn sẽ tạo ra những tiến bộ thú vị trong nhiều lĩnh vực khác nhau, từ khoa học vật liệu đến nghiên cứu dược phẩm. Các công ty đang thử nghiệm công nghệ này để phát triển những thứ như nguồn pin mạnh hơn cho ô tô điện, tạo ra các loại thuốc mới,...

BÀI VIẾT LIÊN QUAN
Phân biệt Comparable và Comparator trong Java

Comparable Comparator trong Java rất hữu ích để sắp xếp tập hợp các đối tượng. Ở bài viết này chúng ta sẽ tìm hiểu cách nó hoạt động, xem một số ví dụ và phân biệt chúng.

BÀI VIẾT LIÊN QUAN
Code Game 2D Dodge Block Bằng Unity (Phần 2)

Hiện có rất nhiều phần mềm Engine hỗ trợ việc lập trình game từ di động đến desktop, như Game Maker Studio, Unreal Engine 4, … trong đó có Unity. Nhìn sơ qua thì Unity có thể là một nền tảng khá khó cho người mới học, họ dễ bị sốc kiến thức khi lần đầu tiếp cận unity vì nó cung cấp 1 lượng lớn thư viện hỗ trợ gồm các thư viện Asset đồ sộ, các model, được dựng sẵn.