Comparable与Comparator用法详解
簡介:
Comparable接口出自java.lang包,它有一個compareTo(Object obj)方法用來比較或排序
Comparator接口出自java.util包,它有一個compare(Object obj1、Object obj2)方法用來排序。
當我們需要對集合進行自定義排序或對象之間進行比較時,就需要重寫compareTo()或者compare()方法。
Comparable:
Comparable是一個對象支持自比較所需要實現的接口,如String、Integer自己就實現了Comparable接口,我們可以直接用他們的CompareTo()方法來比較,或者直接對List<String>或List<Integer>集合進行排序。
例如:
而我們自定義的類如果想進行比較,或者放入list中進行排序,則需要實現Comparable接口的compareTo方法,這樣才支持比較或者排序。否則我們直接調用Collections.sort(list)會出現編譯錯誤的。比如我們有一個Person類,兩個屬性姓名和年齡,想讓List<Person>通過年齡來排序:
public class Person implements Comparable<Person>{private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return this.name;}public void setName(final String name) {this.name = name;}public int getAge() {return this.age;}public void setAge(final int age) {this.age = age;}@Overridepublic int compareTo(Person o) {if(this.age == o.getAge() && this.name == o.getName()){return 0;}else if(this.age > o.getAge()){return 1;}else{return -1;}}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';} } import JavaTest.compare.Person; import org.junit.Test; import java.util.*;public class Test1 {@Testpublic void testComparable() {List<Person> list = new ArrayList<>();Person person1 = new Person("張三",22);Person person2 = new Person("李四",29);Person person3 = new Person("王五",42);list.add(person1);list.add(person2);list.add(person3);// 實現comparable接口就會自動調用compareTo進行排序Collections.sort(list);for (Person p: list) {System.out.println(p);}//比較System.out.println(person1.compareTo(person2));} }Comparator:
Comparator是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足要求時(比如二維數組排序,后面會講到),可寫一個比較器來完成兩個對象之間大小的比較,或者集合排序。
例如:一個User類,同樣有年齡和姓名屬性,我們想對List排序,但User類沒有實現Comparable接口,假定User類我們不能修改,此時我們可以用Comparator來實現。
我們這里通過匿名類的形式new Comparator<User>() 來實現list集合的排序,當然我們也可以再定義一個UserComparator類來實現Comparator接口,然后通過 UserComparator uc = new UserComparator(); Collections.sort(list, uc); 來實現。
由這兩個例子看出Comparable是類的內部實現比較或排序功能,Comparator是外部實現的。
二維數組排序:
另外舉個例子,二維數組排序,按照某一列列大小對數組進行排序。二維數組的排序直接調用Arrays.sort(); 雖然不會出現編譯錯誤,但運行時會出現以下錯誤提示:
說明不可以這樣用,而我們又想對它排序,就可以使用Comparator來外部實現排序了,這里舉一個按照第二列數字大小進行排序的例子:
總結
以上是生活随笔為你收集整理的Comparable与Comparator用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA手动添加jar包
- 下一篇: synchronized修饰静态方法与实