天天看點

2021年大資料常用語言Scala(二十五):函數式程式設計 排序

目錄

​​排序​​

​​預設排序  sorted​​

​​指定字段排序  sortBy​​

​​自定義排序 | sortWith​​

排序

在scala集合中,可以使用以下幾種方式來進行排序

  • sorted預設排序
  • sortBy指定字段排序
  • sortWith自定義排序

預設排序  sorted

示例

定義一個清單,包含以下元素: 3, 1, 2, 9, 7

對清單進行升序排序

參考代碼

scala> List(3,1,2,9,7).sorted
res16: List[Int] = List(1, 2, 3, 7, 9)      

指定字段排序  sortBy

根據傳入的函數轉換後,再進行排序

方法簽名

def sortBy[B](f: (A) ⇒ B): List[A]

方法解析

sortBy方法 API 說明
泛型 [B] 按照什麼類型來進行排序
參數 f: (A) ⇒ B 傳入函數對象<br />接收一個集合類型的元素參數<br />傳回B類型的元素進行排序
傳回值 List[A] 傳回排序後的清單

示例

有一個清單,分别包含幾下文本行:"01 hadoop", "02 flume", "03 hive", "04 spark"

請按照單詞字母進行排序

參考代碼

scala> val a = List("01 hadoop", "02 flume", "03 hive", "04 spark")
a: List[String] = List(01 hadoop, 02 flume, 03 hive, 04 spark)

// 擷取單詞字段
scala> a.sortBy(_.split(" ")(1))
res8: List[String] = List(02 flume, 01 hadoop, 03 hive, 04 spark)      

自定義排序 | sortWith

自定義排序,根據一個函數來進行自定義排序

類似在Java中實作Comparable接口

方法簽名

def sortWith(lt: (A, A) ⇒ Boolean): List[A]

方法解析

sortWith方法 API 說明
參數 lt: (A, A) ⇒ Boolean 傳入一個比較大小的函數對象<br />接收兩個集合類型的元素參數<br />傳回兩個元素大小,小于傳回true,大于傳回false, 也就是升序排序的意思, 如果要實作降序, 可以自行控制小于傳回false 大于傳回true<br />不用去想這兩個參數是如何傳遞的, scala會自動幫我們将帶處理清單的元素兩兩傳遞過來讓我們進行排序
傳回值 List[A] 傳回排序後的清單

示例

有一個清單,包含以下元素:2,3,1,6,4,5

使用sortWith對清單進行降序排序

參考代碼

scala> val a = List(2,3,1,6,4,5)
a: List[Int] = List(2, 3, 1, 6, 4, 5)

scala> a.sortWith((x,y) => if(x<y)true else false)
res15: List[Int] = List(1, 2, 3, 4, 5, 6)

scala> res15.reverse
res18: List[Int] = List(6, 5, 4, 3, 2, 1)      

使用下劃線簡寫上述案例

參考代碼

scala> val a = List(2,3,1,6,4,5)
a: List[Int] = List(2, 3, 1, 6, 4, 5)

// 函數參數隻在函數中出現一次,可以使用下劃線代替
scala> a.sortWith(_ < _).reverse
res19: List[Int] = List(6, 5, 4, 3, 2, 1)      

兩個參數都是隻出現一次, 并沒有嵌套, 那麼可以用下劃線代替