日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java compareable接口_Java对象比较-Comparable和Comparator接口使用

發(fā)布時(shí)間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java compareable接口_Java对象比较-Comparable和Comparator接口使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在學(xué)習(xí)貪心算法和動(dòng)態(tài)規(guī)劃的過程中,里面有一段自然排序的操作,順便簡單了解一下Java中對(duì)象比較后排序要使用的兩個(gè)接口:Comparable和Comparator。如果是數(shù)字,直接比較就行,但是如果是對(duì)象,如何比較后排序呢?就需要用到這兩個(gè)接口了,并且將自己定義的類作為參數(shù)傳入接口泛型,在接口里重寫比較方法,將自己要選擇排序的類屬性添加到比較條件中去。

接口主要區(qū)別

(1)Comparable接口是在java.lang下,Comparator接口是在java.util下。

(2)如果在定義類時(shí),就實(shí)現(xiàn)了Comparable接口,直接在里面重寫compareTo()方法,如果沒實(shí)現(xiàn),后面在業(yè)務(wù)開發(fā)中需要有比較排序的功能,就再單獨(dú)寫一個(gè)類實(shí)現(xiàn)Comparator接口,在里面重寫compare()方法,然后這個(gè)類需要作為參數(shù)傳入到工具類Collections.sort和Arrays.sort方法中。

(3)實(shí)現(xiàn)Comparable接口的類必須是自然排序,另外一個(gè)不是強(qiáng)制條件。

使用Comparable

(1)定義實(shí)現(xiàn)類時(shí),實(shí)現(xiàn)Comparable接口。

1 /**

2 * 實(shí)體類,實(shí)現(xiàn)Comparable接口3 */

4 public class Person implements Comparable{5

6 //屬性

7 privateString name;8 private intage;9 private intsalary;10

11 //get和set方法

12 publicString getName() {13 returnname;14 }15

16 public voidsetName(String name) {17 this.name =name;18 }19

20 public intgetAge() {21 returnage;22 }23

24 public void setAge(intage) {25 this.age =age;26 }27

28 public intgetSalary() {29 returnsalary;30 }31

32 public void setSalary(intsalary) {33 this.salary =salary;34 }35

36 //構(gòu)造方法

37 public Person(String name, int age, intsalary) {38 this.name =name;39 this.age =age;40 this.salary =salary;41 }42

43 @Override44 publicString toString() {45 return "Person{" +

46 "name='" + name + '\'' +

47 ", age=" + age +

48 ", salary=" + salary +

49 '}';50 }51

52 //重寫接口方法,o為要比較的對(duì)象

53 @Override54 public intcompareTo(Person o) {55 //大于要比較的對(duì)象就返回1

56 if(this.salary>o.getSalary()){57 return 1;58 }59 //小于則返回-1

60 else if(this.salary

64 return 0;65 }66 }

(2)測(cè)試類,來查看是否按照自定義的屬性進(jìn)行自然排序。

1 importjava.util.ArrayList;2 importjava.util.Collections;3 importjava.util.List;4

5 public classTestComparable {6

7 public static voidmain(String[] args) {8 //測(cè)試Comparable接口

9 Person p1=new Person("clyang",18,4000);10 Person p2=new Person("messi",30,8000);11 Person p3=new Person("ronald",32,9000);12 Person p4=new Person("herry",19,7600);13 Person p5=new Person("roben",35,7900);14

15 //添加到集合

16 List list=new ArrayList<>();17 list.add(p1);18 list.add(p2);19 list.add(p3);20 list.add(p4);21 list.add(p5);22

23 System.out.println("-----------------排序前-----------------");24 for(Person person : list) {25 System.out.println(person);26 }27

28 //排序一般使用Collections.sort方法,或者使用Arrays.sort方法,按照比較的元素進(jìn)行自然排序,即從小到大

29 Collections.sort(list);30

31 System.out.println("-----------------排序后-----------------");32 for(Person person : list) {33 System.out.println(person);34 }35

36 }37 }

控制臺(tái)輸出情況,發(fā)現(xiàn)正常的按照工資進(jìn)行了自然排序,即升序排列。

使用Comparator

使用這個(gè)接口時(shí),創(chuàng)建類的時(shí)候可以不實(shí)現(xiàn)接口,需要單獨(dú)創(chuàng)建一個(gè)類來實(shí)現(xiàn)這個(gè)接口。

(1)創(chuàng)建類

1 /**

2 * 實(shí)體類,不實(shí)現(xiàn)Comparable接口,使用單獨(dú)的Comparator接口3 */

4 public classStaff {5

6 //屬性

7 privateString name;8 private intage;9 private intsalary;10

11 public Staff(String name, int age, intsalary) {12 this.name =name;13 this.age =age;14 this.salary =salary;15 }16

17 publicString getName() {18 returnname;19 }20

21 public voidsetName(String name) {22 this.name =name;23 }24

25 public intgetAge() {26 returnage;27 }28

29 public void setAge(intage) {30 this.age =age;31 }32

33 public intgetSalary() {34 returnsalary;35 }36

37 public void setSalary(intsalary) {38 this.salary =salary;39 }40

41 @Override42 publicString toString() {43 return "Staff{" +

44 "name='" + name + '\'' +

45 ", age=" + age +

46 ", salary=" + salary +

47 '}';48 }49 }

View Code

(2)創(chuàng)建實(shí)現(xiàn)接口的類,重寫里面的比較方法,這屬于泛型在接口中的一種使用方法,即接口泛型是什么,實(shí)現(xiàn)類里面就是什么泛型。

1 importjava.util.Comparator;2

3 /**

4 * 單獨(dú)寫的比較器,實(shí)現(xiàn)Compartor接口5 */

6 public class StaffComparator implements Comparator{7

8 //不一定要自然排序即升序,可以反過來寫成降序

9 @Override10 public intcompare(Staff o1, Staff o2) {11 //降序

12 /*if(o1.getSalary()>o2.getSalary()){13 return -1;14 }15 if(o1.getSalary()

19

20 //升序

21 /*if(o1.getSalary()>o2.getSalary()){22 return 1;23 }24 if(o1.getSalary()

28

29 //先按照年齡倒序排,如果年齡相等比較工資

30 if(o1.getAge()>o2.getAge()){31 return -1;32 }33 if(o1.getAge()

37 if(o1.getSalary()>o2.getSalary()){38 return 1;39 }40 if(o1.getSalary()

測(cè)試類,來查看是否按照自己的要求來排序。

1 importjava.util.ArrayList;2 importjava.util.Collections;3 importjava.util.Comparator;4 importjava.util.List;5

6 public classTestComparator {7

8 public static voidmain(String[] args) {9 //測(cè)試Comparator接口

10 Staff p1=new Staff("clyang",18,4000);11 Staff p2=new Staff("messi",30,8000);12 Staff p3=new Staff("ronald",32,9000);13 Staff p4=new Staff("herry",18,7600);14 Staff p5=new Staff("roben",35,7900);15

16 //添加到集合

17 List list=new ArrayList<>();18 list.add(p1);19 list.add(p2);20 list.add(p3);21 list.add(p4);22 list.add(p5);23

24 System.out.println("-----------------排序前-----------------");25 for(Staff staff : list) {26 System.out.println(staff);27 }28

29 //排序,需要使用自定義比較類

30 Comparator myComparator=newStaffComparator();31 Collections.sort(list,myComparator);32

33 System.out.println("-----------------排序后-----------------");34 for(Staff staff : list) {35 System.out.println(staff);36 }37 }38 }

控制臺(tái)輸出情況,可以發(fā)現(xiàn),先是按照年齡進(jìn)行了倒排序,當(dāng)排到clyang和herry的時(shí)候,由于年齡相同,因此繼續(xù)按照工資來升排序。

以上是兩種接口的使用方法,也是參考了博主的文章學(xué)習(xí)的,以后可以拿來用。

參考博文:

總結(jié)

以上是生活随笔為你收集整理的java compareable接口_Java对象比较-Comparable和Comparator接口使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。