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

java?集合工具類Collections及Comparable和Comparator排序詳解

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

一、常用功能

java.utils.Collections是集合工具類,用來對集合進(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>();
        //原來寫法
        //list.add(12);
        //list.add(14);
        //list.add(15);
        //list.add(1000);
        //采用工具類 完成 往集合中添加元素  
        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)還有個方法沒有講,public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。接下來講解一下指定規(guī)則的排列。

二、Comparator比較器

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

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ī)則是怎么定義出來的呢? 說到排序了,簡單的說就是兩個對象之間比較大小,那么在JAVA中提供了兩種比較實現(xiàn)的方式,一種是比較死板的采用java.lang.Comparable接口去實現(xiàn),一種是靈活的當(dāng)我需要做排序的時候在去選擇的java.util.Comparator接口完成。 那么我們采用的public static <T> void sort(List<T> list)這個方法完成的排序,實際上要求了被排序的類型需要實現(xiàn)Comparable接口完成比較的功能,

在String類型上如下:

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

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

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

兩個對象比較的結(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");
        //排序方法  按照第一個單詞的降序
        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兩個接口的區(qū)別

Comparable:強(qiáng)行對實現(xiàn)它的每個類的對象進(jìn)行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實現(xiàn)compareTo()一次,不能經(jīng)常修改類的代碼實現(xiàn)自己想要的排序。實現(xiàn)此接口的對象列表(和數(shù)組)可以通過Collections.sort(和Arrays.sort)進(jìn)行自動排序,對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。

**Comparator:**強(qiáng)行對某個對象進(jìn)行整體排序。可以將Comparator 傳遞給sort方法(如Collections.sort或 Arrays.sort),從而允許在排序順序上實現(xiàn)精確控制。還可以使用Comparator來控制某些數(shù)據(jù)結(jié)構(gòu)(如有序set或有序映射)的順序,或者為那些沒有自然順序的對象collection提供排序。

四、練習(xí)

創(chuàng)建一個學(xué)生類,存儲到ArrayList集合中完成指定排序操作。

Student 初始類:

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 +
               '}';
    }
}

測試類:

public class Demo {
    public static void main(String[] args) {
        // 創(chuàng)建四個學(xué)生對象 存儲到集合中
        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中元素類型  必須實現(xiàn)比較器Comparable接口
        for (Student student : list) {
            System.out.println(student);
        }
    }
}

發(fā)現(xiàn),當(dāng)我們調(diào)用Collections.sort()方法的時候 程序報錯了。 原因:如果想要集合中的元素完成排序,那么必須要實現(xiàn)比較器Comparable接口。 于是我們就完成了Student類的一個實現(xiàn),

如下:

public class Student implements Comparable<Student>{
    ....
    @Override
    public int compareTo(Student o) {
        return this.age-o.age;//升序
    }
}

再次測試,代碼就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ò)展

如果在使用的時候,想要獨立的定義規(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){//第一個規(guī)則判斷完了 下一個規(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 集合工具類Collections及Comparable和Comparator排序詳解的文章就介紹到這了,更多相關(guān)java Collections 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

    SpringMVC文件上傳 多文件上傳實例

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

    深度分析java dump文件

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

    Java編程探索之泛型擦除實例解析

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

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

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

    SpringBoot-Maven打包壓縮瘦身方式

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

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

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

    在java上使用亞馬遜云儲存方法

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

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

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

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

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

最新評論

鄂尔多斯市| 阿城市| 洪湖市| 塔河县| 房产| 宿州市| 青海省| 台湾省| 安国市| 尼勒克县| 新平| 湘西| 门源| 台山市| 阿克苏市| 梁平县| 鄱阳县| 乌拉特前旗| 长海县| 东莞市| 木兰县| 邛崃市| 定南县| 色达县| 永清县| 永丰县| 昌吉市| 方正县| 安乡县| 封丘县| 姜堰市| 海南省| 凯里市| 林州市| 云浮市| 沿河| 阿巴嘎旗| 固始县| 日喀则市| 长春市| 阿鲁科尔沁旗|