iT邦幫忙

0

[Java] Comparable vs Comparator

閱讀時間: 10分鐘

Comparable與Comparator的功能相近,但其實有不同的地方。
大家可以因應需求而選擇最好的方式。

首先它們有5個不同地方:
1, Comparable只可被用作物件中一個屬性的自然排序。
Comparator可被用作不同物件不同屬性的排序。

2, Comparable用“this” reference 與指定物件作比較。
Comparator用兩個不同的物件做比較。

3, Comparable在java.lang package內。
Comparator在java.util package內。

4, Comparable需要修改原來的class。
Comparator不需要修改原來的class。

5, Comparable提供compareTo() method來排序元素。
Comparator提供compare() method 和equals() method來排序元素。

這樣說可能會比較抽象,
大家可以看看以下例子。
相信大家看完之後會明白它們兩者實際的區別了。

例子:

import java.io.*; 
import java.util.*; 
  
// Class 'Movie' 實作Comparable interface
class Movie implements Comparable<Movie> 
{ 
    private double rating; 
    private String name; 
    private int year; 
  
    // 用年份排序
    public int compareTo(Movie m) 
    { 
        return this.year - m.year; 
    } 
  
    // Constructor 
    public Movie(String nm, double rt, int yr) 
    { 
        this.name = nm; 
        this.rating = rt; 
        this.year = yr; 
    } 
  
    // Getter methods 目的是存取private元素rating、name、year。
    public double getRating() { return rating; } 
    public String getName()   {  return name; } 
    public int getYear()      {  return year;  } 
} 
  
// Class 比較rating
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 比較name
class NameCompare implements Comparator<Movie> 
{ 
    public int compare(Movie m1, Movie m2) 
    { 
        return m1.getName().compareTo(m2.getName()); 
    } 
} 
  
// 主class
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)); 
  
        // 以rating排序 : 
        // (1) 創建物件ratingCompare 
        // (2) 使用Collections.sort 
        // (3) 列印Sorted list 
        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()); 
  
  
        // 以name排序
        // (1) 創建物件nameCompare
        // (2) 使用Collections.sort 
        // (3) 列印Sorted list 
        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()); 
  
        //以year排序
        System.out.println("\nSorted by year"); 
        Collections.sort(list); 
        for (Movie movie: list) 
            System.out.println(movie.getYear() + " " + 
                               movie.getRating() + " " + 
                               movie.getName()+" "); 
    } 
}   

參考文章/網站/書本:


尚未有邦友留言

立即登入留言