Java中常用的比較器Comparable與Comparator
阿新 • • 發佈:2018-12-26
在公司實習了一段時間發現自己有些基礎知識理解的不是很清楚,今天把比較器的部分簡單總結一下!
有不對的歡迎指正!
需要為多個物件排序時必須設定規定的排序規則,排序規則可以通過比較器進行設定。Java提供兩種比較常用的比較器:Comparable和Comparator.
Comparable介面
它是一個要進行多個物件比較預設實現的一個介面,定義如下:
public interface Comparable<T>{
public int compareTo(T obj);
}
如果想要實現物件屬性的排序功能,就要實現Comparable介面,並且複寫compareTo(T obj)方法,此方法的返回值是一個int型別的資料,有三種情況:
-相等, 0;
-小於, -1;
-大於, 1。
例子如下
class Person implements Comparable<Person>{
private String name;
private double height;
public Person(String name, double height){
this.name = name;
this.height = height;
}
@Override
public String toString(){
return "姓名:"+this.name+",身高:"+this.height+"\n";
}
@Override
public int compareTo(Person per){
if(this.height > per.height){
return 1;
}else if(this.height < per.height){
return -1;
}else{
return 0;
}
}
}
public class TestDemo{
public static void main(String[] args){
List<Person> perList = new ArrayList<Person>();
perList.add(new Person("張三",174.8));
perList.add(new Person("李四",175.7));
Object[] obj[] = perList.toArrays();
Arrays.sort(obj);
System.out.println(Arrays.toString(obj));
}
}
Comparator—挽救的比較器介面
大家都知道Comparable介面是一個類在定義時就已經預設實現好的功能了。
假如一個類已經開發完成,在此類使用很久之後,你又想實現這個類物件的陣列排序,但是此類沒有實現Comparable介面,所以一定不能用Arrays類的sort()方法實現排序,並且這個類由於某種原因不能修改。這種情況下如果還想實現排序,就必須進行另一種比較規則的設定,即:挽救比較規則,Comparator介面定義如下:
public interface Comparator<T>{
public int compare(T obj1, T obj2);
public boolean equals(Object obj);
}
舉例說明:
class Book{
private String name;
private double price;
public Book(String name, double price){
this.name = name;
this.price = price;
}
public void setPrice(double price){
this.price = price;
}
public void setName(String name){
this.name = name;
}
public String getName(){
retrun name;
}
public double getPrice(){
return price;
}
@Override
public String toString(){
return "書名:"+this.name+",價格:"+this.price;
}
}
假如上面的類就是定義的完整的類,並且沒有實現Comparable介面,現在就需要單獨定一個類,實現Comparator介面,專門為Book類物件提供比較規則,第一如下:
class BookComparatoe implements Comparator<Book>{
@Override
public int compare(Book o1, Book o2){
if(o1.getPrice() > o2.getPrice()){
return 1;
}else if(o1.getPrice() < o2.getPrice()){
return -1;
}
return 0;
}
}
如果想要使用以上規則必須使用Arrays 的另外一個物件比較的排序方法。
public static <T> void sort(T[] a, Comparator<? super T> c);
實現如下:
public class TestDemo{
public static void main(String[] args){
Book book[] = new Book[]{
new Book("三國演義", 23);
new Book("紅樓夢", 12);
new book("水滸傳", 8);};
Arrays.sort(book, new BookComparator());
System.out.println(Arrays.toString(book));
}
}
通過以上總結我們能清楚地瞭解了Comparable和Comparator的區別和用法。
本文主要參考:魔樂科技的Java基礎一書。