日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Comparable与Comparator用法详解

發布時間:2025/1/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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>集合進行排序。
例如:

String s1 = "abc"; String s2 = "aba"; System.out.println(s1.compareTo(s2)); // 2 List<String> list = new ArrayList<>(); list.add("abc"); list.add("ab"); list.add("dde"); Collections.sort(list);for (String s : list) {System.out.println(s); }

而我們自定義的類如果想進行比較,或者放入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來實現。

public class User {private String name;private int age;public User(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 String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';} } @Test public void testComparator() {List<User> list = new ArrayList<>();User user1 = new User("張三",22);User user2 = new User("李四",29);User user3 = new User("王五",42);list.add(user1);list.add(user2);list.add(user3);Collections.sort(list, new Comparator<User>() {@Overridepublic int compare(User o1, User o2) {if(o1.getAge() == o2.getAge() && o1.getName() == o2.getName()){return 0;}else if(o1.getAge() > o2.getAge()){return 1;}else{return -1;}}});for (User u: list) {System.out.println(u);}}

我們這里通過匿名類的形式new Comparator<User>() 來實現list集合的排序,當然我們也可以再定義一個UserComparator類來實現Comparator接口,然后通過 UserComparator uc = new UserComparator(); Collections.sort(list, uc); 來實現。

由這兩個例子看出Comparable是類的內部實現比較或排序功能,Comparator是外部實現的。

二維數組排序:
另外舉個例子,二維數組排序,按照某一列列大小對數組進行排序。二維數組的排序直接調用Arrays.sort(); 雖然不會出現編譯錯誤,但運行時會出現以下錯誤提示:

說明不可以這樣用,而我們又想對它排序,就可以使用Comparator來外部實現排序了,這里舉一個按照第二列數字大小進行排序的例子:

public class ArrayCompare {public static void main(String[] args) {int[][] arr = new int[4][2];System.out.println("產生的二維數組arr為:");for (int i = 0; i < 4; i++) {arr[i][0] = (int)(Math.random()*10 + 1);arr[i][1] = (int)(Math.random()*10 + 2);System.out.println(Arrays.toString(arr[i]));}//arr2拷貝一份arr的值,這里沒什么意義,就簡單使用一下cloneint[][] arr2 = new int[4][2];arr2 = arr.clone();//arr以第二列值大小排序Arrays.sort(arr2, new Comparator<int[]>() {@Overridepublic int compare(int[] t0, int[] t1) { // t0與t1類似于兩個對象進行比較,這里表示兩個一維數組,即二維數組的兩行if(t0[1] == t1[1]){return t0[0]-t1[0]; //第二列中的值相同時,再比較第一列的大小,如果不需要也可以直接return 0}return t0[1] - t1[1];}});System.out.println("arr自定義排序為:");showArray(arr2);}public static void showArray(int[][] arr){for (int[] row : arr) {System.out.println(Arrays.toString(row));}} }


總結

以上是生活随笔為你收集整理的Comparable与Comparator用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。