兩者都是java的比較器。不過 comparable,需要被比較的類自己去實作排序邏輯;comparator不需要。
Comparator和Comparable的差別
參數 | Comparable | Comparator |
---|---|---|
排序邏輯 | 排序邏輯必須在待排序對象的類中,故稱之為自然排序 | 排序邏輯在另一個實作 |
實作 | 實作Comparable接口 | 實作Comparator接口 |
排序方法 | | |
觸發排序 | Collections.sort(List) | Collections.sort(List, Comparator) |
接口所在包 | | |
----------
實作比較person,先按年齡排,年齡相同的按工資排。
------
1.comparable 實作。(person類實作Comparable接口,實作比較方法compareTo,比較時使用Conllections.sort(list)即可 )
package com.fjf.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestComparable {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
list.add(new Person("張三", 50,"男",500.00));
list.add(new Person("李四", 27,"女",800.00));
list.add(new Person("王五", 33,"男",500.00));
list.add(new Person("趙六", 33,"男",1000.00));
list.add(new Person("付8", 33,"男",500.00));
for (Person p : list) {
System.out.println(p);
}
System.out.println("--------Comparable比較----------");
Collections.sort(list);
for (Person p : list) {
System.out.println(p);
}
}
}
class Person implements Comparable<Person>{
private String name;
private int age;
private String sex;
private double salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Person(String name, int age, String sex,double salary) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.salary = salary;
}
public Person() {
super();
}
@Override
public int compareTo(Person o) {
int ageCompare = this.age - o.age;
if(ageCompare==0){ //年齡相同 用工資排
int salaryCompare = (this.salary - o.salary)>0.00?-1:1; //工資如果再相同就不管了
System.out.println(salaryCompare);
return salaryCompare;
}
return ageCompare;
//return o.age -this.age;
//this.compareTo(o.age);
//this.getAge().compareTo(o.getAge());
//this.name.compareTo(anotherString)
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex
+ ", salary=" + salary + "]";
}
}
--------------------------------
2.comparator實作。(pesron類自己無需實作任何比較邏輯。在真正比較時,Conllections.sort(list,Comparator)在傳入一個comparator比較器實作比較邏輯)
package com.fjf.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestComparator {
public static void main(String[] args) {
List<Person2> list = new ArrayList<Person2>();
list.add(new Person2("張三", 50,"男",500.00));
list.add(new Person2("李四", 27,"女",800.00));
list.add(new Person2("王五", 33,"男",500.00));
list.add(new Person2("趙六", 33,"男",1000.00));
list.add(new Person2("付8", 33,"男",500.00));
for (Person2 p : list) {
System.out.println(p);
}
System.out.println("---------Comparator比較----------");
Collections.sort(list, new Comparator<Person2>() {
@Override
public int compare(Person2 o1, Person2 o2) {
int ageCompare = o1.getAge()-o2.getAge();
if(ageCompare == 0){
int salaryCompare = (o1.getSalary()-o2.getSalary()>0.00?1:-1);
return salaryCompare;
}
return ageCompare;
}
});
for (Person2 p : list) {
System.out.println(p);
}
}
}
class Person2 {
private String name;
private int age;
private String sex;
private double salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Person2(String name, int age, String sex, double salary) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.salary = salary;
}
public Person2() {
super();
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex
+ ", salary=" + salary + "]";
}
}
---
附:網友的一些介紹。
https://blog.csdn.net/u013256816/article/details/50899416/
https://blog.csdn.net/u014133299/article/details/78608454