四 集合——第七節(jié) Collections集合工具類

Collections常用功能
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ī)則排序。擴(kuò)展了解就行

1碎捺、Collections集合工具類的方法

addAll 路鹰、 shuffle

package listandset;

import java.util.ArrayList;
import java.util.Collections;

/**
 * created by apple on 2020/6/20
 */
public class Demo01Collections {
    public static void main(String[] args) {
        ArrayList<String> li = new ArrayList<>();
        //往集合中添加多個(gè)元素
        Collections.addAll(li,"a","b","c","d","e");
        System.out.println(li);  //[a, b, c, d,e]
       //打亂集合中的順序
        Collections.shuffle(li);
        System.out.println(li);  //[a, b, d, e, c]

    }
}

2、排序收厨,sort 默認(rèn)的和重寫的 Comparable

package listandset;

/**
 * created by apple on 2020/6/20
 */
public class PersonCollections implements Comparable<PersonCollections>{
    private String name;
    private int age;

    public PersonCollections() {
    }

    public PersonCollections(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "PersonCollections{" +
                "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;
    }
//重寫排序的規(guī)則
    @Override
    public int compareTo(PersonCollections o) {
       // return 0;//認(rèn)為元素都是相同的晋柱,
        //自定義比較的規(guī)則,比較兩個(gè)人的年齡(this, 參數(shù)傳過來的Person)
        return this.getAge() - o.getAge();  //年齡升序排序
    }
}

測試類

package listandset;

import java.util.ArrayList;
import java.util.Collections;

/**
 * created by apple on 2020/6/20
 * java.util.Collections 是集合工具類诵叁,用來對集合操作
 * public static<T> void sort(sort<T> list)  按默認(rèn)規(guī)則排序
 *注意:
 * sort(sort<T> list) 使用前提雁竞,被排序的集合里邊存儲的元素必須實(shí)現(xiàn)Comparable,重寫接口中的方法compareTo,定義排序的規(guī)則

  Comparable 接口的排序規(guī)則:
  自己調(diào)用(this) - 參數(shù): 升序。
 */
public class Demo02Collections {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,5,3,9,5);
        System.out.println(list);
        Collections.sort(list);
        //Interer 這個(gè)類黎休,自己重寫了compareTo的方法浓领,所以直接排序
        System.out.println(list);

        ArrayList<PersonCollections> list03 = new ArrayList<>();
        list03.add(new PersonCollections("zhang",18));  //匿名對象
        list03.add(new PersonCollections("lisi",20));
        list03.add(new PersonCollections("wangw",19));
        System.out.println(list03);//[PersonCollections{name='zhang', age=18}, PersonCollections{name='lisi', age=20}, PersonCollections{name='wangw', age=19}]
        Collections.sort(list03);
        System.out.println(list03);
        //[PersonCollections{name='zhang', age=18}, PersonCollections{name='wangw', age=19}, PersonCollections{name='lisi', age=20}]
    }
}

輸出:

[1, 5, 3, 9, 5]
[1, 3, 5, 5, 9]
[PersonCollections{name='zhang', age=18}, PersonCollections{name='lisi', age=20}, PersonCollections{name='wangw', age=19}]
[PersonCollections{name='zhang', age=18}, PersonCollections{name='wangw', age=19}, PersonCollections{name='lisi', age=20}]

3玉凯、sort排序。 Comparator接口

package listandset;

/**
 * created by apple on 2020/6/20
 */
public class StudentSort {
    private String name;
    private int age;

    public StudentSort() {
    }

    public StudentSort(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "StudentSort{" +
                "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;
    }
}

測試類

package listandset;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * created by apple on 2020/6/20
 * java.util.Collections 集合工具類联贩。
 * public static<T> void sort(sort<T> list漫仆,Comparator<? super T>)  按指定規(guī)則排序
 * Comparator 和 Comparable 區(qū)別
 * Comparable :自己this和別人(參數(shù))比較,自己需要實(shí)現(xiàn)Comparable接口泪幌,重寫比較的規(guī)則compareTo 方法
 * Comparator :找一個(gè)第三方的裁判盲厌,比較兩個(gè)
 * Comparator排序規(guī)則:
 *     o1 - o2  升序,反之降序
 */
public class Demo03Sort {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,5,3,9,5);
        System.out.println(list);
        Collections.sort(list, new Comparator<Integer>() { // Comparator 一個(gè)接口祸泪,使用匿名內(nèi)部類
           //重寫比較的規(guī)則
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;  //升序排序
            }
        });
        //Interer 這個(gè)類吗浩,自己重寫了compareTo的方法,所以直接排序
        System.out.println(list);   //[1, 3, 5, 5, 9]

        ArrayList<StudentSort> st = new ArrayList<>();
        st.add(new StudentSort("li",18));
        st.add(new StudentSort("zhang",15));
        st.add(new StudentSort("wang",19));

        System.out.println(st);
        Collections.sort(st, new Comparator<StudentSort>() {
            @Override
            public int compare(StudentSort o1, StudentSort o2) {
               //按照年齡升序排序
                return o1.getAge() - o2.getAge();
            }
        });
        System.out.println(st);
    }
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

Collection和Collections之間的使用與區(qū)別(順帶講解Comparable與Comparator區(qū)別)

Collection没隘,它是單列集合類的根接口懂扼,用于存儲一系列符合某種規(guī)則的元素,它主要的子接口分別是List和Set右蒲。

Collections則是集合工具類阀湿,用來對集合進(jìn)行操作」逋可以理解為服務(wù)Collection集合的工具類陷嘴,主要提供一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序间坐、線程安全等操作

文章目錄

1.1

使用代碼如下:

package base;

import java.util.ArrayList;
import java.util.Collections;

/**
 * @author duyanyan
 * @date 2021/4/29 20:27
 * connections 的實(shí)現(xiàn)
 */
public class CollectionsDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        //原來添加寫法
        //list.add(233);
        //list.add(555);
        //list.add(666);
        //list.add(7777);

        //采用工具類灾挨,完成向集合中添加元素
        Collections.addAll(list,1,4,8,9,6);
        System.out.println(list);

        //排序
        Collections.sort(list);
        System.out.println(list);
    }
}
結(jié)果:
[1, 4, 8, 9, 6]
[1, 4, 6, 8, 9]

代碼測試之后 ,發(fā)現(xiàn)我們的集合按照順序進(jìn)行了排列竹宋,可是這樣的順序是采用默認(rèn)的順序劳澄,如果想要指定順序那該怎么辦呢?

我們發(fā)現(xiàn)還有這個(gè)方法沒有講public static <T> void sort(List<T> list蜈七,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序浴骂。接下來講解一下指定規(guī)則的排列。

1.2 Comparator比較器的使用

研究這個(gè)方法前還是先研究這個(gè)public static <T> void sort(List<T> list)方法先宪潮。

public static <T> void sort(List<T> list):將集合中元素按照默認(rèn)規(guī)則排序溯警。

使用這個(gè)方法存儲字符串類型代碼如下【注意這里是字符串類型】:

package base;

import java.util.ArrayList;
import java.util.Collections;

/**
 * @author duyanyan
 * @date 2021/4/29 20:32
 */
public class CollectioinsDemo1 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        Collections.addAll(list,"小鹵蛋","小短腿","小魯班","小憨包");
        Collections.sort(list);
        System.out.println(list);
    }
}

結(jié)果:
[小鹵蛋, 小憨包, 小短腿, 小魯班]

我們使用的是默認(rèn)的規(guī)則完成字符串的排序,那么默認(rèn)規(guī)則是怎么定義出來的呢狡相?

說到排序了梯轻,簡單的說就是兩個(gè)對象之間比較大小,那么在JAVA中提供了兩種比較實(shí)現(xiàn)的方式尽棕,
一種是比較死板的采用java.lang.Comparable接口去實(shí)現(xiàn)喳挑,
一種是比較靈活的當(dāng)我需要做排序的時(shí)候在去選擇的java.util.Comparator接口完成。

1.3 分析String源碼

那么我們采用的public static <T> void sort(List<T> list)這個(gè)方法完成的排序,實(shí)際上要求了被排序的類型需要實(shí)現(xiàn)Comparable接口完成比較的功能伊诵,在String類型上如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */

String類實(shí)現(xiàn)了這個(gè)Comparable接口(Integer也實(shí)現(xiàn)這接口)单绑,并完成了比較規(guī)則的定義,但是這樣就把這種規(guī)則寫死了曹宴,那比如我想要字符串按照第一個(gè)字符降序排列搂橙,那么這樣就要修改String的源代碼,修改源碼這件事這是不可能的了笛坦!除非你們慫恿博主跑去sun公司修改源碼区转,接著我就刪庫跑路竖般,最后絕壁是挨最毒的打…

那么這個(gè)時(shí)候我們可以使用public static <T> void sort(List<T> list吧享,Comparator<? super T> )方法靈活的完成,這個(gè)里面就涉及到了Comparator這個(gè)接口绍撞,位于位于java.util包下礁芦,排序是comparator能實(shí)現(xiàn)的功能之一,該接口代表一個(gè)比較器蜻韭,比較器具有可比性!顧名思義就是做排序的柿扣,通俗地講需要比較兩個(gè)對象誰排在前誰排在后湘捎,那么比較的方法就是compare,如下:

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

兩個(gè)對象比較的結(jié)果有三種:大于,等于舷胜,小于娩践。
如果要按照升序排序,
則o1 小于o2烹骨,返回(負(fù)數(shù))翻伺,相等返回0,o1大于o2返回(正數(shù))
如果要按照降序排序
則o1 小于o2沮焕,返回(正數(shù))吨岭,相等返回0,o1大于o2返回(負(fù)數(shù))

package base;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * @author duyanyan
 * @date 2021/4/30 10:50
 */
public class CollectionsDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("cba");
        list.add("aba");
        list.add("sba");
        list.add("nba");

        //之前的排序
        Collections.sort(list);
        System.out.println("sort排序:" + list);

        //新的排序方法峦树,按照第一個(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("Comparator接口排序:" + list);

    }
}

結(jié)果:
sort排序:[aba, cba, nba, sba]
Comparator接口排序:[sba, nba, cba, aba]

1.4Comparable接口和Comparator接口區(qū)別

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

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

總而言之
comparable是需要比較對象來實(shí)現(xiàn)接口,這樣對象調(diào)用實(shí)現(xiàn)的方法來比較窗悯。對對象的耦合度高(需要改變對象的內(nèi)部結(jié)構(gòu)区匣,破壞性大)。
comparator相當(dāng)于一通用的比較工具類接口蟀瞧。需要定制一個(gè)比較類去實(shí)現(xiàn)它沉颂,重寫里面的compare方法,方法的參數(shù)即是需要比較的對象悦污。對象不用做任何改變铸屉。解耦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末切端,一起剝皮案震驚了整個(gè)濱河市彻坛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踏枣,老刑警劉巖昌屉,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茵瀑,居然都是意外死亡间驮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門马昨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竞帽,“玉大人,你說我怎么就攤上這事鸿捧∫俾ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵匙奴,是天一觀的道長堆巧。 經(jīng)常有香客問我,道長泼菌,這世上最難降的妖魔是什么谍肤? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮哗伯,結(jié)果婚禮上谣沸,老公的妹妹穿的比我還像新娘。我一直安慰自己笋颤,他們只是感情好乳附,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布内地。 她就那樣靜靜地躺著,像睡著了一般赋除。 火紅的嫁衣襯著肌膚如雪阱缓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天举农,我揣著相機(jī)與錄音荆针,去河邊找鬼。 笑死颁糟,一個(gè)胖子當(dāng)著我的面吹牛航背,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棱貌,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼玖媚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婚脱?” 一聲冷哼從身側(cè)響起今魔,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎障贸,沒想到半個(gè)月后错森,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篮洁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年涩维,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袁波。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓦阐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锋叨,到底是詐尸還是另有隱情,我是刑警寧澤宛篇,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布娃磺,位于F島的核電站,受9級特大地震影響叫倍,放射性物質(zhì)發(fā)生泄漏偷卧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一吆倦、第九天 我趴在偏房一處隱蔽的房頂上張望听诸。 院中可真熱鬧,春花似錦蚕泽、人聲如沸晌梨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仔蝌。三九已至泛领,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敛惊,已是汗流浹背渊鞋。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞧挤,地道東北人锡宋。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像特恬,于是被迫代替她去往敵國和親执俩。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容