阅读时间: 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 interfaceclass 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 比较ratingclass 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 比较nameclass NameCompare implements Comparator<Movie> { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // 主classclass 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()+" "); } }
参考文章/网站/书本:
Comparable vs Comparator in Java
Comparable and Comparator in Java
Java Comparable Example for Natural Order Sorting
Comparable Interface
Comparable in Java