java的Comparator和Comparable
當需要排序的集合或陣列不是單純的數字型時,通常可以使用Comparator或Comparable,以簡單的方式實現物件排序或自定義排序。
一、Comparator
強行對某個物件collection進行整體排序的比較函式,可以將Comparator傳遞給Collections.sort或Arrays.sort。
介面方法:
/**
* @return o1小於、等於或大於o2,分別返回負整數、零或正整數。
*/
int compare(Object o1, Object o2);
案例:
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator<String> {
public int compare(String o1, String o2) {
return toInt(o1) - toInt(o2);
}
private int toInt(String str) {
str = str.replaceAll("一", "1");
str = str.replaceAll("二", "2");
str = str.replaceAll("三", "3");
return Integer.parseInt(str);
}
/**
* 測試方法
*/
public static void main(String[] args) {
String[] array = new String[] { "一二", "三", "二" };
Arrays.sort(array, new SampleComparator());
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
二、Comparable
強行對實現它的每個類的物件進行整體排序,實現此介面的物件列表(和陣列)可以通過Collections.sort或Arrays.sort進行自動排序。
介面方法:
/**
* @return 該物件小於、等於或大於指定物件o,分別返回負整數、零或正整數。
*/
int compareTo(Object o);
假設物件User,需要按年齡排序:
public class User {
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
改造後的物件:
import java.util.Arrays;
public class User implements Comparable<User> {
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int compareTo(User u) {
return this.age - u.getAge();
}
/**
* 測試方法
*/
public static void main(String[] args) {
User[] users = new User[] { new User("a", 30), new User("b", 20) };
Arrays.sort(users);
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}
}
三、Comparator和Comparable的區別
先看一下使用Comparable對User集合實現排序的方式:一個類實現了Camparable介面則表明這個類的物件之間是可以相互比較的,這個類物件組成的集合就可以直接使用sort方法排序。
Comparator可以看成一種演算法的實現,將演算法和資料分離,Comparator也可以在下面兩種環境下使用:
1、類的設計師沒有考慮到比較問題而沒有實現Comparable,可以通過Comparator來實現排序而不必改變物件本身
2、可以使用多種排序標準,比如升序、降序等
在TreeSet和TreeMap中新增的自定義物件必須實現Comparable介面
相關文章
- Java基礎系列-Comparable和ComparatorJava
- Java Comparable 和 Comparator 介面詳解Java
- Java 中 Comparable 和 Comparator 比較Java
- java基礎之Comparator和ComparableJava
- Java Comparable 與 ComparatorJava
- Comparable和Comparator的區別
- 閒說: Java 中Comparable 和 Comparator 的區別Java
- Java中Comparable和Comparator介面區別分析Java
- Java Comparable排序介面和Comparator比較器介面Java排序
- 比較器-Comparable和Comparator
- Comparable與Comparator的區別
- 來吧,一文徹底搞懂Java中的Comparable和ComparatorJava
- java容器之List+Comparable與Comparator比較Java
- 從java內建類和自定義類比較Comparable介面和Comparator介面實現排序的不同Java排序
- Comparator and Comparable 及Collections and Collection 的區別及聯絡?
- java Comparable和Comaprator的對比Java
- 【集合框架】JDK1.8原始碼分析之Comparable && Comparator(九)框架JDK原始碼
- java中的Comparable介面Java
- JAVA中的Comparable介面和自定義比較器Java
- 【JAVA語法】 -- 方便的Comparable介面Java
- Java 8 Comparator: 列表排序Java排序
- Java 8: Lambda表示式增強版Comparator和排序Java排序
- cannot be cast to java.lang.ComparableASTJava
- Java 集合排序策略介面 ComparatorJava排序
- 5 分鐘搞定 Java Comparable 介面Java
- 字串排序 (java comparator介面的使用)字串排序Java
- Java8-增強版Comparator和排序之Lambda表示式Java排序
- java8-Lambda中比較器Comparator的使用Java
- Comparable介面的實現和使用
- Java利用Comparator實現分組排序Java排序
- JAVA Comparator 自定義排序 原始碼分析Java排序原始碼
- 【Java】Collection.sort以及比較器ComparatorJava
- Java stream sorted使用 Comparator 進行多欄位排序Java排序
- 餓了麼開源專案:Java Comparator生成器Java
- TreeSet重寫Comparator排序排序
- JDK原始碼閱讀-Comparable介面JDK原始碼
- List排序用Collections.sort and Comparator排序
- 通過Comparable來實現對自身的比較