Java(28)java比較器
阿新 • • 發佈:2020-08-29
JAVA比較器
java的比較器主要分為兩種,第一種是實現Comparable介面的內部比較器,第二種是實現Comparator介面的外部比較器。
Comparabel介面的部分原始碼如下:
public interface Comparable<T> {
public int compareTo(T o);
}
Comparator介面的部分原始碼如下:
public interface Comparator<T> {
int compare(T o1, T o2);
}
內部比較器--Comparable介面
Comparable
介面位於java.lang
當需要對某個類(可以是自己定義的)的物件進行排序時候,則需要實現Comparable
這個介面,然後重寫compareTo
方法。我們的類實現這個介面和重寫方法後,就可以使用Array.sort()
對這個類的例項物件陣列進行排序,或者使用Collection.sort
對這個類的物件List集合進行排序。我們需要在compareTo
方法裡定義我們的排序規則。注意:自定義類的時候最好重寫頂級父類Object
的toString()
方法。
案例1:內部比較器
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class Employee implements Comparable<Employee> { //這裡記得要指定泛型 private String name; private int id; private long salary; public Employee(String name, int id, long salary) { this.name = name; this.id = id; this.salary = salary; } @Override public int compareTo(Employee o) { if (this.salary > o.salary) { return (1); } else if (this.salary < o.salary) { return (-1); } else { return (0); } } //預設的toString()方法,呼叫頂級父類Object的toString()方法 // @Override // public String toString() { // return super.toString(); // } //super.toString(),父類Object的toString原始碼如下,該方法預設返回類名和hashCode相關資訊 // public String toString() { // return getClass().getName() + "@" + Integer.toHexString(hashCode()); // } //重寫toString()方法 @Override public String toString() { return (this.name+"\t"+this.id+"\t"+this.salary); } } class RunClass { public static void main(String[] args) { Employee[] ems = { new Employee("zhansan", 23522, 20000), new Employee("lisi", 23436, 24000), new Employee("laowang", 235634, 10000) }; System.out.println("===============使用Arrays.sort()來進行排序"); //排序前 for(Employee e:ems){ System.out.println(e.toString()); } Arrays.sort(ems); System.out.println("=============="); //排序後 for(Employee e:ems){ System.out.println(e.toString()); } System.out.println("===============使用Arrays.sort()來進行排序"); List<Employee> myList=new ArrayList<Employee>(); myList.add(new Employee("zhansan", 23522, 20000)); myList.add(new Employee("lisi", 23436, 24000)); myList.add(new Employee("lisi", 23436, 24000)); //排序前 for(Employee e:ems){ System.out.println(e.toString()); } Collections.sort(myList); System.out.println("=============="); //排序後 for(Employee e:ems){ System.out.println(e.toString()); } } }
執行輸出結果如下:
===============使用Arrays.sort()來進行排序 zhansan 23522 20000 lisi 23436 24000 laowang 235634 10000 ============== laowang 235634 10000 zhansan 23522 20000 lisi 23436 24000 ===============使用Arrays.sort()來進行排序 laowang 235634 10000 zhansan 23522 20000 lisi 23436 24000 ============== laowang 235634 10000 zhansan 23522 20000 lisi 23436 24000
外部比較器--Comparator介面
Comparator
介面位於java.util
包下。
Comparator
介面是一個跟Comparable
介面功能很相近的比較器。比較大的區別是,實現該介面的類一般是一個獨立的類。詳情看程式碼:
import java.util.*;
class Employee{
private String name;
private int age;
private long salary;
public Employee(String name,int age,long salary){
this.salary=salary;
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
@Override
public String toString() {
return this.name+"\t"+this.age+"\t"+this.salary;
}
}
//建立年齡比較器:
class AgeComparator implements Comparator<Employee>{
@Override
public int compare(Employee o1, Employee o2) {
if (o1.getAge()>o2.getAge()){
return 1;
}else if(o1.getAge()<o2.getAge()){
return -1;
}else {
return 0;
}
}
}
//建立薪水比較器:
class SalaryComparator implements Comparator<Employee>{
@Override
public int compare(Employee o1, Employee o2) {
if (o1.getSalary() > o2.getSalary()) {
return 1;
} else if (o1.getSalary() < o2.getSalary()) {
return -1;
} else {
return 0;
}
}
}
class RunClass {
public static void main(String[] args) {
Employee[] ems = {
new Employee("zhansan", 26, 30000),
new Employee("lisi",14, 24000),
new Employee("laowang",40, 10000)
};
System.out.println("===============使用薪水比較器來進行排序");
//排序前
for(Employee e:ems){
System.out.println(e.toString());
}
Arrays.sort(ems,new SalaryComparator()); //使用薪水比較器進行排序
System.out.println("==============");
//排序後
for(Employee e:ems){
System.out.println(e.toString());
}
System.out.println("===============使用年齡比較器來進行排序");
List<Employee> myList=new ArrayList<Employee>();
myList.add(new Employee("zhansan", 23522, 20000));
myList.add(new Employee("lisi", 23436, 24000));
myList.add(new Employee("lisi", 23436, 24000));
//排序前
for(Employee e:ems){
System.out.println(e.toString());
}
Collections.sort(myList,new AgeComparator()); //使用年齡比較器進行排序
System.out.println("==============");
//排序後
for(Employee e:ems){
System.out.println(e.toString());
}
}
}
執行輸出結果如下:
===============使用薪水比較器來進行排序
zhansan 26 30000
lisi 14 24000
laowang 40 10000
==============
laowang 40 10000
lisi 14 24000
zhansan 26 30000
===============使用年齡比較器來進行排序
laowang 40 10000
lisi 14 24000
zhansan 26 30000
==============
laowang 40 10000
lisi 14 24000
zhansan 26 30000
內部與外部比較器的區別
如果定義一個類的時候,沒有考慮到排序的問題,即沒有實現Comparable
介面,那麼就可以通過實現Comparator
介面來來進行自定義排序。Comparator
可以方便使用不同的排序規則,更加靈活一點。