【Java】基礎26:集合比較器

前幾天學了Collecion集合,今天學習它對應的工具類Collections。
數組

什麼叫工具類?微信

工具類它是一種特殊的類,它的成員變量和成員方法,基本都是靜態的,使用起來特別方便,直接用類名就能夠調用,不用建立對象。工具

  • 數組有一個對應工具類Arrays。學習

  • Object有一個對應的工具類Objects。this

  • 集合Collection也有一個對應的工具類Collections。spa

後面加一個s也就成了對應的工具類,很是好記。.net

在學習以前,須要先了解下什麼叫可變參數。對象

1、可變參數

字面意思理解就是能夠變化的參數,再準確一點,可變的是參數的個數。blog

不要看這好像是個新的概念,其實很簡單,咱們基本每天都能見到。排序

如今有幾個很是簡單的需求:

  1. 求兩個整數之和;

  2. 求三個整數之和;

  3. 求四個整數之和;

按照我目前所學到的Java知識,我會這樣解決:

  1. 建立方法一,參數爲兩個int,返回值爲它們之和。

  2. 建立方法二,參數爲三個int,返回值爲它們三之和。

  3. 建立方法三,參數爲四個int,返回值爲它們四之和。

使用到的知識:方法重載

那麼如今問題來了,這也太麻煩了吧,有沒有簡化方法?

有,可變參數就能夠,直接一個方法就能夠了:

  • 可變參數格式:數據類型... 變量名。

  • 可變參數本質上就是一個數組,能夠用加強for循環遍歷。

  • 理論上可變參數的個數能夠無數個。

關於可變參數還有以下特色:

①一個參數列表只能有一個可變參數。

這個好理解,一個可變參數就能夠表明無數個參數,不必兩個。

②其餘類型的普通參數能夠用,但可變參數要放在後面。

這個也好理解,由於可變參數,參數數量可變,若是它放在前面,那麼不管傳多少個參數進來,都被它全盤接受了,因此要放後面。

2、Collections

其經常使用的主要有3個方法:

①addAll方法:添加方法

添加多個元素進入list集合,使用的即是可變參數,這樣的話比一個一個元素依次添加要方便些。

②sort方法:排序方法

如果數字,按照從小到大的順序排列;

如果字符串,則按照字符串首字母對應ASCII碼錶從小到大。

③shuffle方法:亂序方法

將集合中的全部元素打亂。

其中,Collections的sort方法排序是升序排列,若是咱們想自定義排序規則該怎麼辦?

比較器就能夠自定義排序。

3、比較器

Java裏面有兩個比較器:ComparatorComparable

咱們先定義一個Person類,成員變量有兩個:name和age;

如今要按照年齡排序怎麼辦?

1.Comparator

①建立三個Person對象,並添加進集合中。

②比較器Comparator:

使用匿名內部類,由於Comparator是一個接口,無法實例化建立對象,須要子類建立對象,由於子類對象只須要使用一次,因此但是使用匿名內部類。

此處的匿名內部類,就至關因而一個子類實現了Comparator接口,並重寫了compare方法。

③如何判斷升序仍是降序?

  • o1-o2,能夠記成,1到2,就是升序;

  • o2-o1,能夠記成,2到1,就是降序。

咱們要求是要比較年齡大小並降序排列,

因此是:o2.age-o1.age。

Comparator能夠用來自定義排序規則,好比說我剛纔是按照年齡大小降序排列,我如今又想升序排列了,直接重複一次步驟②,將③中的規則倒過來就行了。

2.Comparable

Comparable也是一個接口,它的做用也是能夠自定義規則,可是它是在類中就把規則制定好了,直接就可使用Collections的sort方法。

①將咱們建立的類實現Comparable比較器。

這樣作了,就能夠直接使用Collections的sort方法,否則會報錯。

最早開始,在第二節中,咱們用Collections調用sort方法,能夠將字符串和數字升序排序。

本質緣由就是由於String了和Integer類底層已經實現Comparable接口了,而且制定的規則就是升序排序。

如果咱們本身建立的類須要排序,就得本身實現Comparable比較器

②重寫Comparable的compareTo方法。

③制定排序規則:

this.o就至關於o1,o就至關於o2;

  • o1-o2,能夠記成1到2,就是升序;

  • o2-o1,能夠記成2到1,就是降序。

④添加三個Person對象

⑤Collections的sort方法若是比較的是person對象,就是咱們本身制定的規則,也就是降序。

3.Comparator和Comparable的區別

  • Comparable它是自定義類的默認排序規則,制定好了,那麼只要是和這個類有關的排序都按照這個規則來,若是要修改,須要修改在類中制定的默認規則。

  • Comparator更加的靈活:同一個類,我此次想升序排序,下次又想降序排序了,只須要匿名內部類重寫方法就行了,而且它可以覆蓋Comparable的規則。

這就是它們之間的區別,而且很容易把它們弄混淆,我想了一個笨方法來記它們:

  • Comparator,這是一個名詞,能夠直接拿來用,也就是匿名內部類。

  • Comparable,這是一個形容詞,不能直接拿來用,得用須要排序的類去實現它。

固然我這個說法不太準確,不過拿來理解區分它們仍是能夠的。

總結:

本文分享自微信公衆號 - 劉小愛(liuxiaoai946)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索