十三、实现Comparable接口和new ComparatorT(){ }排序的实现过程
參考:https://www.cnblogs.com/igoodful/p/9517784.html
?
Collections有兩種比較規則方式,第一種是使用自身的比較規則:
該類必須實現Comparable接口并重寫comparTo方法。
this可以想象為1,傳入對象o想象為2,返回1-2即按升序排序。返回2-1即按降序排序。
1、首先編寫一個實現Comparable接口的實體類
1 package com.abc; 2 //Comparable接口后面一定要加上需要比較的數據類型 3 public class Person implements Comparable<Person>{ 4 5 private String name; 6 private int age; 7 private int salary; 8 9 public Person() { 10 } 11 12 public Person(String name, int age, int salary) { 13 this.name = name; 14 this.age = age; 15 this.salary = salary; 16 } 17 18 public String getName() { 19 return name; 20 } 21 22 public void setName(String name) { 23 this.name = name; 24 } 25 26 public int getAge() { 27 return age; 28 } 29 30 public void setAge(int age) { 31 this.age = age; 32 } 33 34 public int getSalary() { 35 return salary; 36 } 37 38 public void setSalary(int salary) { 39 this.salary = salary; 40 } 41 42 @Override 43 public String toString() { 44 return "Person{" + 45 "name='" + name + '\'' + 46 ", age=" + age + 47 ", salary=" + salary + 48 '}'; 49 } 50 51 //自身定義年齡升序 52 @Override 53 public int compareTo(Person o) { 54 return this.age-o.age; 55 } 56 }?2、編寫測試代碼
package com.abc;import java.util.ArrayList; import java.util.Collections; import java.util.List;public class PersonTest {public static void main(String[] args){List<Person> people = new ArrayList<>();people.add(new Person("AAA",20,100));people.add(new Person("BBB",18,109));people.add(new Person("CCC",30,58));System.out.println(people);Collections.sort(people);System.out.println(people);} }3、運行結果
[Person{name='AAA', age=20, salary=100}, Person{name='BBB', age=18, salary=109}, Person{name='CCC', age=30, salary=58}]//完成了年齡的升序排列 [Person{name='BBB', age=18, salary=109}, Person{name='AAA', age=20, salary=100}, Person{name='CCC', age=30, salary=58}]
?
?
?
第二個參數為比較器,可以使用它來定義針對集合排序時的比較元素大小的規則。
使用這種方式時,sort方法不要求集合元素必須實現Comparable接口了,因為不會使用元素自身的比較規則。
1、編寫一個普通的實體類,不需要實現任何接口
package com.abcd;public class Person{private String name;private int age;private int salary;public Person() {}public Person(String name, int age, int salary) {this.name = name;this.age = age;this.salary = 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 int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}';}}2、編寫測試代碼
package com.abcd;import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List;public class PersonTest {public static void main(String[] args){List<Person> people = new ArrayList<>();people.add(new Person("AAA",20,100));people.add(new Person("BBB",18,109));people.add(new Person("CCC",30,58));System.out.println(people);//排序規則 salary降序Collections.sort(people, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o2.getSalary()- o1.getSalary();}});System.out.println(people);} }
3、運行結果
[Person{name='AAA', age=20, salary=100}, Person{name='BBB', age=18, salary=109}, Person{name='CCC', age=30, salary=58}] [Person{name='BBB', age=18, salary=109}, Person{name='AAA', age=20, salary=100}, Person{name='CCC', age=30, salary=58}]
總結
總結一下,兩種比較器Comparable和Comparator,后者相比前者有如下優點:
1、如果實現類沒有實現Comparable接口,又想對兩個類進行比較(或者實現類實現了Comparable接口,但是對compareTo方法內的比較算法不滿意),那么可以實現Comparator接口,自定義一個比較器,寫比較算法
2、實現Comparable接口的方式比實現Comparator接口的耦合性 要強一些,如果要修改比較算法,要修改Comparable接口的實現類,而實現Comparator的類是在外部進行比較的,不需要對實現類有任何修 改。從這個角度說,其實有些不太好,尤其在我們將實現類的.class文件打成一個.jar文件提供給開發者使用的時候。實際上實現Comparator 接口的方式后面會寫到就是一種典型的策略模式。
當然,這不是鼓勵用Comparator,意思是開發者還是要在具體場景下選擇最合適的那種比較器而已。
?
轉載于:https://www.cnblogs.com/mason117/p/10646382.html
總結
以上是生活随笔為你收集整理的十三、实现Comparable接口和new ComparatorT(){ }排序的实现过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件系统分析-分账系统
- 下一篇: Xcode9 调整模拟器大小