欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、常用功能

java.utils.Collections是集合工具類,用來對集合進行操作。

部分方法如下:

  • public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
  • public static void shuffle(List<?> list) 打亂順序:打亂集合順序。
  • public static <T> void sort(List<T> list):將集合中元素按照默認規(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)我們的集合按照順序進行了排列,可是這樣的順序是采用默認的順序,如果想要指定順序那該怎么辦呢? 我們發(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):將集合中元素按照默認規(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]

我們使用的是默認的規(guī)則完成字符串的排序,那么默認規(guī)則是怎么定義出來的呢? 說到排序了,簡單的說就是兩個對象之間比較大小,那么在JAVA中提供了兩種比較實現(xiàn)的方式,一種是比較死板的采用java.lang.Comparable接口去實現(xiàn),一種是靈活的當我需要做排序的時候在去選擇的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,返回(負數(shù)),相等返回0,01大于02返回(正數(shù)) 如果要按照降序排序 則o1 小于o2,返回(正數(shù)),相等返回0,01大于02返回(負數(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:強行對實現(xiàn)它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實現(xiàn)compareTo()一次,不能經(jīng)常修改類的代碼實現(xiàn)自己想要的排序。實現(xiàn)此接口的對象列表(和數(shù)組)可以通過Collections.sort(和Arrays.sort)進行自動排序,對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。

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

四、練習

創(chuàng)建一個學生類,存儲到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)建四個學生對象 存儲到集合中
        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));
        /*
          讓學生 按照年齡排序 升序
         */
//        Collections.sort(list);//要求 該list中元素類型  必須實現(xiàn)比較器Comparable接口
        for (Student student : list) {
            System.out.println(student);
        }
    }
}

發(fā)現(xiàn),當我們調(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}

五、擴展

如果在使用的時候,想要獨立的定義規(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();//以學生的年齡降序
    }
});

效果:

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)文章

  • 解析Mybatis延遲加載問題

    解析Mybatis延遲加載問題

    這篇文章主要介紹了Mybatis的延遲加載問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • SpringBoot讀取resource目錄下文件失敗的原因及解決方案

    SpringBoot讀取resource目錄下文件失敗的原因及解決方案

    在idea中運行時,有些resource下文件讀取工具類能夠正常獲取讀取到文件,但是通過java–jar的方式去運行jar包,此時resource下文件讀取工具類讀取文件就失效了,本文就給大家介紹一下SpringBoot讀取resource目錄下文件失敗解決方案,需要的朋友可以參考下
    2023-08-08
  • JAVA JSP頁面技術(shù)之EL表達式整理歸納總結(jié)

    JAVA JSP頁面技術(shù)之EL表達式整理歸納總結(jié)

    這篇文章主要介紹了java中JSP頁面技術(shù)之EL表達式概念作用以及語法等的使用,需要的朋友可以參考
    2017-04-04
  • MyBatis自動生成Where語句

    MyBatis自動生成Where語句

    這篇文章主要介紹了MyBatis自動生成Where語句的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • SpringBoot中Jackson日期格式化技巧分享

    SpringBoot中Jackson日期格式化技巧分享

    一般在SpringBoot項目中,spring默認使用jackson轉(zhuǎn)換日期,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中Jackson日期格式化技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • StringUtils里的isEmpty方法和isBlank方法的區(qū)別詳解

    StringUtils里的isEmpty方法和isBlank方法的區(qū)別詳解

    這篇文章主要介紹了StringUtils里的isEmpty方法和isBlank方法的區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-04-04
  • Java之Buffer屬性案例詳解

    Java之Buffer屬性案例詳解

    這篇文章主要介紹了Java之Buffer屬性案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Intellij IDEA 配置Subversion插件實現(xiàn)步驟詳解

    Intellij IDEA 配置Subversion插件實現(xiàn)步驟詳解

    這篇文章主要介紹了Intellij IDEA 配置Subversion插件實現(xiàn)步驟詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • IntelliJ IDEA 2020安裝使用教程詳解

    IntelliJ IDEA 2020安裝使用教程詳解

    這篇文章主要介紹了IntelliJ IDEA 2020安裝使用教程,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • java模板引擎Thymeleaf和前端vue的區(qū)別及說明

    java模板引擎Thymeleaf和前端vue的區(qū)別及說明

    這篇文章主要介紹了java模板引擎Thymeleaf和前端vue的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論