Collections集合工具类的方法_sort(List,Comparator)
簡(jiǎn)述Comparable和Comparator兩個(gè)接口的區(qū)別。
Comparable:強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類(lèi)的對(duì)象進(jìn)行整體排序。這種排序被稱(chēng)為類(lèi)的自然排序,類(lèi)的compareTo方法被稱(chēng)為它的自然比較方法。只能在類(lèi)中實(shí)現(xiàn)compareTo()一次,不能經(jīng)常修改類(lèi)的代碼實(shí)現(xiàn)自己想要的排序。實(shí)現(xiàn)此接口的對(duì)象列表(和數(shù)組)可以通過(guò)Collections.sort(和Arrays.sort)進(jìn)行自動(dòng)排序,對(duì)象可以用作有序映射中的鍵或有序集合中的元素,無(wú)需指定比較器。
Comparator強(qiáng)行對(duì)某個(gè)對(duì)象進(jìn)行整體排序。可以將Comparator 傳遞給sort方法(如Collections.sort或 Arrays.sort),從而允許在排序順序上實(shí)現(xiàn)精確控制。還可以使用Comparator來(lái)控制某些數(shù)據(jù)結(jié)構(gòu)(如有序set或有序映射)的順序,或者為那些沒(méi)有自然順序的對(duì)象collection提供排序。
練習(xí)
創(chuàng)建一個(gè)學(xué)生類(lèi),存儲(chǔ)到ArrayList集合中完成指定排序操作。
Student 初始類(lèi)
package com.learn.demo05.Collections;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}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;} }測(cè)試類(lèi):
public class Demo {public static void main(String[] args) {// 創(chuàng)建四個(gè)學(xué)生對(duì)象 存儲(chǔ)到集合中ArrayList<Student> list = new ArrayList<Student>();list.add(new Student("rose",18));list.add(new Student("jack",16));list.add(new Student("abc",16));list.add(new Student("ace",17));list.add(new Student("mark",16));/*讓學(xué)生 按照年齡排序 升序*/ // Collections.sort(list);//要求 該list中元素類(lèi)型 必須實(shí)現(xiàn)比較器Comparable接口for (Student student : list) {System.out.println(student);}} }發(fā)現(xiàn),當(dāng)我們調(diào)用Collections.sort()方法的時(shí)候 程序報(bào)錯(cuò)了。
原因:如果想要集合中的元素完成排序,那么必須要實(shí)現(xiàn)比較器Comparable接口。
于是我們就完成了Student類(lèi)的一個(gè)實(shí)現(xiàn),如下:
public class Student implements Comparable<Student>{....@Overridepublic int compareTo(Student o) {return this.age-o.age;//升序} }再次測(cè)試,代碼就OK 了效果如下:
Student{name='jack', age=16} Student{name='abc', age=16} Student{name='mark', age=16} Student{name='ace', age=17} Student{name='rose', age=18}擴(kuò)展
如果在使用的時(shí)候,想要獨(dú)立的定義規(guī)則去使用 可以采用Collections.sort(List list,Comparetor<T> c)方式,自己定義規(guī)則:
Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o2.getAge()-o1.getAge();//以學(xué)生的年齡降序} });效果:
Student{name='rose', age=18} Student{name='ace', age=17} Student{name='jack', age=16} Student{name='abc', age=16} Student{name='mark', age=16}如果想要規(guī)則更多一些,可以參考下面代碼:
Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {// 年齡降序int result = o2.getAge()-o1.getAge();//年齡降序if(result==0){//第一個(gè)規(guī)則判斷完了 下一個(gè)規(guī)則 姓名的首字母 升序result = o1.getName().charAt(0)-o2.getName().charAt(0);}return result;}});效果如下:
Student{name='rose', age=18} Student{name='ace', age=17} Student{name='abc', age=16} Student{name='jack', age=16} Student{name='mark', age=16} package com.learn.demo05.Collections;import java.util.ArrayList; import java.util.Collections; import java.util.Comparator;/*- java.utils.Collections是集合工具類(lèi),用來(lái)對(duì)集合進(jìn)行操作。部分方法如下:public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。Comparator和Comparable的區(qū)別Comparable:自己(this)和別人(參數(shù))比較,自己需要實(shí)現(xiàn)Comparable接口,重寫(xiě)比較的規(guī)則compareTo方法Comparator:相當(dāng)于找一個(gè)第三方的裁判,比較兩個(gè)Comparator的排序規(guī)則:o1-o2:升序*/ public class Demo03Sort {public static void main(String[] args) {ArrayList<Integer> list01 = new ArrayList<>();list01.add(1);list01.add(3);list01.add(2);System.out.println(list01);//[1, 3, 2]Collections.sort(list01, new Comparator<Integer>() {//重寫(xiě)比較的規(guī)則@Overridepublic int compare(Integer o1, Integer o2) {//return o1-o2;//升序return o2-o1;//降序}});System.out.println(list01);ArrayList<Student> list02 = new ArrayList<>();list02.add(new Student("a迪麗熱巴",18));list02.add(new Student("古力娜扎",20));list02.add(new Student("楊冪",17));list02.add(new Student("b楊冪",18));System.out.println(list02);/*Collections.sort(list02, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//按照年齡升序排序return o1.getAge()-o2.getAge();}});*///擴(kuò)展:了解Collections.sort(list02, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//按照年齡升序排序int result = o1.getAge()-o2.getAge();//如果兩個(gè)人年齡相同,再使用姓名的第一個(gè)字比較if(result==0){result = o1.getName().charAt(0)-o2.getName().charAt(0);}return result;}});System.out.println(list02);} }?
超強(qiáng)干貨來(lái)襲 云風(fēng)專(zhuān)訪(fǎng):近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Collections集合工具类的方法_sort(List,Comparator)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Collections集合工具类的方法_
- 下一篇: 函数式接口的概念函数式接口的定义