十三、实现Comparable接口和new ComparatorT(){ }排序的实现过程
參考:https://www.cnblogs.com/igoodful/p/9517784.html
?
Collections有兩種比較規(guī)則方式,第一種是使用自身的比較規(guī)則:
該類必須實(shí)現(xiàn)Comparable接口并重寫comparTo方法。
this可以想象為1,傳入對(duì)象o想象為2,返回1-2即按升序排序。返回2-1即按降序排序。
1、首先編寫一個(gè)實(shí)現(xiàn)Comparable接口的實(shí)體類
1 package com.abc; 2 //Comparable接口后面一定要加上需要比較的數(shù)據(jù)類型 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、編寫測(cè)試代碼
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、運(yùn)行結(jié)果
[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}]
?
?
?
第二個(gè)參數(shù)為比較器,可以使用它來定義針對(duì)集合排序時(shí)的比較元素大小的規(guī)則。
使用這種方式時(shí),sort方法不要求集合元素必須實(shí)現(xiàn)Comparable接口了,因?yàn)椴粫?huì)使用元素自身的比較規(guī)則。
1、編寫一個(gè)普通的實(shí)體類,不需要實(shí)現(xiàn)任何接口
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、編寫測(cè)試代碼
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);//排序規(guī)則 salary降序Collections.sort(people, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o2.getSalary()- o1.getSalary();}});System.out.println(people);} }
3、運(yùn)行結(jié)果
[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}]
總結(jié)
總結(jié)一下,兩種比較器Comparable和Comparator,后者相比前者有如下優(yōu)點(diǎn):
1、如果實(shí)現(xiàn)類沒有實(shí)現(xiàn)Comparable接口,又想對(duì)兩個(gè)類進(jìn)行比較(或者實(shí)現(xiàn)類實(shí)現(xiàn)了Comparable接口,但是對(duì)compareTo方法內(nèi)的比較算法不滿意),那么可以實(shí)現(xiàn)Comparator接口,自定義一個(gè)比較器,寫比較算法
2、實(shí)現(xiàn)Comparable接口的方式比實(shí)現(xiàn)Comparator接口的耦合性 要強(qiáng)一些,如果要修改比較算法,要修改Comparable接口的實(shí)現(xiàn)類,而實(shí)現(xiàn)Comparator的類是在外部進(jìn)行比較的,不需要對(duì)實(shí)現(xiàn)類有任何修 改。從這個(gè)角度說,其實(shí)有些不太好,尤其在我們將實(shí)現(xiàn)類的.class文件打成一個(gè).jar文件提供給開發(fā)者使用的時(shí)候。實(shí)際上實(shí)現(xiàn)Comparator 接口的方式后面會(huì)寫到就是一種典型的策略模式。
當(dāng)然,這不是鼓勵(lì)用Comparator,意思是開發(fā)者還是要在具體場(chǎng)景下選擇最合適的那種比較器而已。
?
轉(zhuǎn)載于:https://www.cnblogs.com/mason117/p/10646382.html
總結(jié)
以上是生活随笔為你收集整理的十三、实现Comparable接口和new ComparatorT(){ }排序的实现过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件系统分析-分账系统
- 下一篇: Xcode9 调整模拟器大小