最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java?集合工具類(lèi)Collections及Comparable和Comparator排序詳解

 更新時(shí)間:2022年06月15日 09:45:19   作者:??共飲一杯無(wú)????  
這篇文章主要介紹了java集合工具類(lèi)Collections及Comparable和Comparator排序詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

一、常用功能

java.utils.Collections是集合工具類(lèi),用來(lái)對(duì)集合進(jìn)行操作。

部分方法如下:

  • public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
  • public static void shuffle(List<?> list) 打亂順序:打亂集合順序。
  • public static <T> void sort(List<T> list):將集合中元素按照默認(rèn)規(guī)則排序。
  • public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。

代碼演示:

public class CollectionsDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        //原來(lái)寫(xiě)法
        //list.add(12);
        //list.add(14);
        //list.add(15);
        //list.add(1000);
        //采用工具類(lèi) 完成 往集合中添加元素  
        Collections.addAll(list, 5, 222, 1,2);
        System.out.println(list);
        //排序方法 
        Collections.sort(list);
        System.out.println(list);
    }
}

結(jié)果:

[5, 222, 1, 2]
[1, 2, 5, 222]

代碼演示之后 ,發(fā)現(xiàn)我們的集合按照順序進(jìn)行了排列,可是這樣的順序是采用默認(rèn)的順序,如果想要指定順序那該怎么辦呢? 我們發(fā)現(xiàn)還有個(gè)方法沒(méi)有講,public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。接下來(lái)講解一下指定規(guī)則的排列。

二、Comparator比較器

我們還是先研究這個(gè)方法 public static <T> void sort(List<T> list):將集合中元素按照默認(rèn)規(guī)則排序。 不過(guò)這次存儲(chǔ)的是字符串類(lèi)型。

public class CollectionsDemo2 {
    public static void main(String[] args) {
        ArrayList<String>  list = new ArrayList<String>();
        list.add("cba");
        list.add("aba");
        list.add("sba");
        list.add("nba");
        //排序方法
        Collections.sort(list);
        System.out.println(list);
    }
}

結(jié)果:

[aba, cba, nba, sba]

我們使用的是默認(rèn)的規(guī)則完成字符串的排序,那么默認(rèn)規(guī)則是怎么定義出來(lái)的呢? 說(shuō)到排序了,簡(jiǎn)單的說(shuō)就是兩個(gè)對(duì)象之間比較大小,那么在JAVA中提供了兩種比較實(shí)現(xiàn)的方式,一種是比較死板的采用java.lang.Comparable接口去實(shí)現(xiàn),一種是靈活的當(dāng)我需要做排序的時(shí)候在去選擇的java.util.Comparator接口完成。 那么我們采用的public static <T> void sort(List<T> list)這個(gè)方法完成的排序,實(shí)際上要求了被排序的類(lèi)型需要實(shí)現(xiàn)Comparable接口完成比較的功能,

在String類(lèi)型上如下:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {

String類(lèi)實(shí)現(xiàn)了這個(gè)接口,并完成了比較規(guī)則的定義,但是這樣就把這種規(guī)則寫(xiě)死了,那比如我想要字符串按照第一個(gè)字符降序排列,那么這樣就要修改String的源代碼,這是不可能的了,那么這個(gè)時(shí)候我們可以使用 public static <T> void sort(List<T> list,Comparator<? super T> )方法靈活的完成,這個(gè)里面就涉及到了Comparator這個(gè)接口,位于位于java.util包下,排序是comparator能實(shí)現(xiàn)的功能之一,該接口代表一個(gè)比較器,比較器具有可比性!顧名思義就是做排序的,通俗地講需要比較兩個(gè)對(duì)象誰(shuí)排在前誰(shuí)排在后,那么比較的方法就是:

  • public int compare(String o1, String o2):比較其兩個(gè)參數(shù)的順序。

兩個(gè)對(duì)象比較的結(jié)果有三種:大于,等于,小于。 如果要按照升序排序,

則o1 小于o2,返回(負(fù)數(shù)),相等返回0,01大于02返回(正數(shù)) 如果要按照降序排序 則o1 小于o2,返回(正數(shù)),相等返回0,01大于02返回(負(fù)數(shù))

操作如下:

public class CollectionsDemo3 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("cba");
        list.add("aba");
        list.add("sba");
        list.add("nba");
        //排序方法  按照第一個(gè)單詞的降序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.charAt(0) - o1.charAt(0);
            }
        });
        System.out.println(list);
    }
}

結(jié)果如下:

[sba, nba, cba, aba]

三、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)行整體排序??梢詫omparator 傳遞給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):

public class Student{
    private String name;
    private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.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;
    }
    @Override
    public String toString() {
        return "Student{" +
               "name='" + name + '\'' +
               ", 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>{
    ....
    @Override
    public 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 c)方式,自己定義規(guī)則:

Collections.sort(list, new Comparator<Student>() {
    @Override
    public 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>() {
            @Override
            public 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}

到此這篇關(guān)于java 集合工具類(lèi)Collections及Comparable和Comparator排序詳解的文章就介紹到這了,更多相關(guān)java Collections 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用mongoTemplate實(shí)現(xiàn)多條件加分組查詢(xún)方式

    使用mongoTemplate實(shí)現(xiàn)多條件加分組查詢(xún)方式

    這篇文章主要介紹了使用mongoTemplate實(shí)現(xiàn)多條件加分組查詢(xún)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringMVC文件上傳 多文件上傳實(shí)例

    SpringMVC文件上傳 多文件上傳實(shí)例

    這篇文章主要介紹了SpringMVC文件上傳 多文件上傳實(shí)例,有需要的朋友可以參考一下
    2014-01-01
  • 深度分析java dump文件

    深度分析java dump文件

    java內(nèi)存dump是jvm運(yùn)行時(shí)內(nèi)存的一份快照,利用它可以分析是否存在內(nèi)存浪費(fèi),可以檢查內(nèi)存管理是否合理,當(dāng)發(fā)生OOM的時(shí)候,可以找出問(wèn)題的原因。那么dump文件的內(nèi)容是什么樣的呢?
    2021-05-05
  • Java編程探索之泛型擦除實(shí)例解析

    Java編程探索之泛型擦除實(shí)例解析

    這篇文章主要介紹了Java編程探索之泛型擦除實(shí)例解析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 使用JAVA8 filter對(duì)List多條件篩選的實(shí)現(xiàn)

    使用JAVA8 filter對(duì)List多條件篩選的實(shí)現(xiàn)

    這篇文章主要介紹了使用JAVA8 filter對(duì)List多條件篩選的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringBoot-Maven打包壓縮瘦身方式

    SpringBoot-Maven打包壓縮瘦身方式

    這篇文章主要介紹了SpringBoot-Maven打包壓縮瘦身方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java static方法用法實(shí)戰(zhàn)案例總結(jié)

    Java static方法用法實(shí)戰(zhàn)案例總結(jié)

    這篇文章主要介紹了Java static方法用法,結(jié)合具體案例形式總結(jié)分析了java static方法功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • 在java上使用亞馬遜云儲(chǔ)存方法

    在java上使用亞馬遜云儲(chǔ)存方法

    這篇文章主要介紹了在java上使用亞馬遜云儲(chǔ)存方法,首先寫(xiě)一個(gè)配置類(lèi),寫(xiě)一個(gè)controller接口調(diào)用方法存儲(chǔ)文件,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2024-01-01
  • 關(guān)于spring版本與JDK版本不兼容的問(wèn)題及解決方法

    關(guān)于spring版本與JDK版本不兼容的問(wèn)題及解決方法

    這篇文章主要介紹了關(guān)于spring版本與JDK版本不兼容的問(wèn)題,本文給大家?guī)?lái)了解決方法,需要的朋友可以參考下
    2018-11-11
  • SpringCloud服務(wù)之間Feign調(diào)用不會(huì)帶上請(qǐng)求頭header的解決方法

    SpringCloud服務(wù)之間Feign調(diào)用不會(huì)帶上請(qǐng)求頭header的解決方法

    在Spring?Cloud中,使用Feign進(jìn)行服務(wù)之間的調(diào)用時(shí),默認(rèn)情況下是不會(huì)傳遞header的,這篇文章給大家介紹SpringCloud服務(wù)之間Feign調(diào)用不會(huì)帶上請(qǐng)求頭header的解決方法,感興趣的朋友一起看看吧
    2024-01-01

最新評(píng)論

方山县| 深圳市| 涿鹿县| 宿州市| 吉木乃县| 辽源市| 集安市| 闽清县| 山阴县| 金坛市| 长顺县| 河源市| 仪征市| 确山县| 洮南市| 雷山县| 横峰县| 陵川县| 宣威市| 章丘市| 铜山县| 黔西| 长海县| 吐鲁番市| 四子王旗| 徐水县| 永靖县| 泾源县| 阿巴嘎旗| 故城县| 托克逊县| 云安县| 潍坊市| 板桥市| 吉隆县| 邳州市| 英山县| 合肥市| 张掖市| 白玉县| 永宁县|