java內外部比較器(Comparator、Comparable)使用場景與詳解
阿新 • • 發佈:2019-02-09
內外部比較器使用:
- 內部比較器:需比較的類實現介面 Comparable,使該類對外提供一個預設比較的實現
public class Test {
public static void main(String[] args) {
//建立TreeSet並加入worker物件
TreeSet<Worker> set = new TreeSet<Worker>();
set.add(new Worker("zhang3", 18));
set.add(new Worker("li4", 25));
set.add(new Worker("wang5", 22));
set.add(new Worker("lao6", 22));
set.add(new Worker("xiaoming", 22));
//遍歷輸出資訊
Iterator<Worker> iterator = set.iterator();
while (iterator.hasNext()) {
Worker worker = iterator.next();
System.out.println(worker);
}
}
}
public class Worker implements Comparable<Worker> {
private String name;
private int age;
public Worker(String name, int age) {
super();
this.name = name;
this.age = age;
}
/*
* 先按年齡排,次要按名字排
* 負整數、零或正整數,根據此物件是小於、等於還是大於指定物件。
*/
@Override
public int compareTo(Worker w) {
int sub = this.age - w.age;
if (sub == 0)
return this.name.compareTo(w.name);//使用String的comareTo方法
else
return sub;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Worker [name=" + name + ", age=" + age + "]";
}
}
- 外部比較器:需比較的類不做任何實現,該類通過工具類Collections呼叫sort方法傳入一個實現了介面 Comparator的類和一個List
public class Test {
public static void main(String[] args) {
//建立List並加入worker物件
List<Worker> list = new ArrayList<Worker>();
list.add(new Worker("zhang3", 18));
list.add(new Worker("li4", 25));
list.add(new Worker("wang5", 22));
list.add(new Worker("lao6", 22));
list.add(new Worker("xiaoming", 22));
Collections.sort(list, new MyComparator());//傳入list和比較器排序
//遍歷輸出資訊
for (int i = 0; i < list.size(); i++) {
Worker worker = list.get(i);
System.out.println(worker);
}
}
}
public class Worker {
private String name;
private int age;
public Worker(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Worker [name=" + name + ", age=" + age + "]";
}
}
public class MyComparator implements Comparator<Worker> {
/*
* 先按年齡排,次要按名字排
* 根據第一個引數小於、等於或大於第二個引數分別返回負整數、零或正整數
*/
@Override
public int compare(Worker o1, Worker o2) {
int sub = o1.getAge() - o2.getAge();
if (sub == 0)
return o1.getName().compareTo(o2.getName());//使用String的comareTo方法
else
return sub;
}
}
總結:
- TreeSet僅能根據建立時實現的comparable介面(內部比較器)進行排序,且HashSet不支援內部比較器,工具類Collections.sort()方法僅能對List排序。
- TreeSet—使用— 內部比較器
- List—使用—外部比較器
- 在一個類沒有提供比較器時或提供的比較器不適用時,就需要使用外部比較器(例如:拿到一個jar包但它的類沒比較器,總不能反編譯去改程式碼)