Scala獲取列表中的前5個元素,scala的三個排序方法

 2023-12-06 阅读 23 评论 0

摘要:sorted 對一個集合進行自然排序,通過傳遞隱式的Ordering無需參數 def sorted[B >: A](implicit ord: Ordering[B]): Repr scala> val a = List(10, 5, 8, 1, 7).sorted a: List[Int] = List(1, 5, 7, 8, 10)scala> val b = List("banana"

sorted

  • 對一個集合進行自然排序,通過傳遞隱式的Ordering
  • 無需參數
def sorted[B >: A](implicit ord: Ordering[B]): Repr
scala> val a = List(10, 5, 8, 1, 7).sorted
a: List[Int] = List(1, 5, 7, 8, 10)scala> val b = List("banana", "pear", "apple", "orange").sorted
b: List[String] = List(apple, banana, orange, pear)

自定義類型的排序
如果序列持有的類型沒有隱式類型,則無法用 對它進行排序
其中empList.sorted.foreach(println)等價于

empList.sorted(Ordering[Emp]).foreach(println)

利用隱式參數完成排序

object _SortDemo4 extends App {val firstEmp: Emp = Emp(1, "michael", 1000.00)val secondEmp: Emp = Emp(2, "james", 12000.00)val thirdEmp = Emp(3, "shaun", 9000.00)val empList = List(firstEmp, secondEmp, thirdEmp)//傳參的時候不需要傳入隱式參數empList.sorted.foreach(println)
}case class Emp(id: Int, name: String, salary: Double) {
}object Emp {
//定義一個隱式變量implicit val suibian: Ordering[Emp] = new Ordering[Emp] {override def compare(x: Emp, y: Emp): Int = {val rs: Int = (x.salary - y.salary).toIntrs}}
}

隱式參數可以不用傳遞,系統會自動尋找

object _02Simple {def main(args: Array[String]): Unit = {val firstEmp: Emp = Emp(1, "michael", 12000.00)val secondEmp: Emp = Emp(2, "james", 12000.00)val thirdEmp = Emp(3, "shaun", 12000.00)val empList=List(firstEmp,secondEmp,thirdEmp)empList.sorted.foreach(println)}
}case class Emp(id: Int, name: String, salary: Double) extends Ordered[Emp] {override def compare(that: Emp): Int = this.name.compareTo(that.name)
}

SortWith

要傳入一個比較函數,且該函數的返回值為布爾類型

def sortWith(lt: (A, A) => Boolean): Repr
scala> val list=List("a","d","F","B","e")
list: List[String] = List(a, d, F, B, e)scala> list.sortWith((x,y)=>x.toLowerCase<y.toLowerCase())
res0: List[String] = List(a, B, d, e, F)
scala>  List("Steve", "Tom", "John", "Bob").sortWith(_.compareTo(_) < 0)
res1: List[String] = List(Bob, John, Steve, Tom)

自定義類的排序
比較簡單,不用定義隱式什么的

object _02Simple {def main(args: Array[String]): Unit = {val firstEmp: Emp = Emp(1, "michael", 12000.00)val secondEmp: Emp = Emp(2, "james", 12000.00)val thirdEmp = Emp(3, "shaun", 12000.00)val empList = List(firstEmp, secondEmp, thirdEmp)empList.sortWith((p1, p2) => {p1.name < p2.name}).foreach(println)}
}case class Emp(id: Int, name: String, salary: Double) {}

SortBy

Scala獲取列表中的前5個元素?依據隱式的排序方法進行排序

def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr

一維排序例子

scala> val words = "The quick brown fox jumped over the lazy dog".split(' ')
words: Array[String] = Array(The, quick, brown, fox, jumped, over, the, lazy, dog)
//依據字符串長度進行排序
scala> words.sortBy(x=>x.length)
res0: Array[String] = Array(The, fox, the, dog, over, lazy, quick, brown, jumped)
//先依據字符串長度,再依據首字母排序
scala> words.sortBy(x=>x.length,x.head)
<console>:26: error: too many arguments for method sortBy: (f: String => B)(implicit ord: scala.math.Ordering[B])Array[String]words.sortBy(x=>x.length,x.head)^scala> words.sortBy(x=>(x.length,x.head))
res2: Array[String] = Array(The, dog, fox, the, lazy, over, brown, quick, jumped)
//依據字典排序
scala> words.sortBy(x=>x)
res3: Array[String] = Array(The, brown, dog, fox, jumped, lazy, over, quick, the)

二維排序例子

scala> val a = List(("a",2),("b",44),("c",20),("a",20),("a",1))
a: List[(String, Int)] = List((a,2), (b,44), (c,20), (a,20), (a,1))
//依據數字進行排序
scala> a.sortBy(x=>x._2)
res8: List[(String, Int)] = List((a,1), (a,2), (c,20), (a,20), (b,44))
//先依據字母排序,字母相同的依據數字排序
scala> a.sortBy(x=>(x._1,x._2))
res9: List[(String, Int)] = List((a,1), (a,2), (a,20), (b,44), (c,20))scala> a.sortBy(x=>x._1)
res10: List[(String, Int)] = List((a,2), (a,20), (a,1), (b,44), (c,20))
//先依據數字排序,數字相同的依據字母排序
scala> a.sortBy(x=>(x._2,x._1))
res11: List[(String, Int)] = List((a,1), (a,2), (a,20), (c,20), (b,44))

sortBy源碼底層調用了sorted

def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr = sorted(ord on f)

自定義類的排序

object _02Simple {def main(args: Array[String]): Unit = {val firstEmp: Emp = Emp(1, "michael", 10000.00)val secondEmp: Emp = Emp(2, "james", 18000.00)val thirdEmp = Emp(3, "shaun", 12000.00)val empList = List(firstEmp, secondEmp, thirdEmp)empList.sortBy(p => p.salary)(Ordering[Double]).foreach(println)}
}case class Emp(id: Int, name: String, salary: Double) {}

總結

  • sorted排序無需傳參,默認字典排序,自動根據類型尋找隱式類進行排序,比如元素為String,就去找String的隱式排序
  • sortWith 需要自己傳遞一個比較函數,返回值為布爾類型
  • SortBy需要自己傳入一個比較字段.sorted傳不了
  • 自定義類的排序用SortWith與SortBy會比較方便
  • 多字段排序用SortBy比較方便.

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/189370.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息