天天看點

scala神奇的sortBy方法

在學習scala的過程中,其中的集合确實會難倒很多人,今天就主要分享我對sortBy函數的了解

scala神奇的sortBy方法

這是官網對sortBy函數的解釋和例子,個人對此沒有怎麼看懂,是以自己摸索實踐,慢慢總結出來自己的想法,

scala神奇的sortBy方法

這個是在編譯器裡面自動出來的

首先我們看,這個sortBy[B],第一個B是指傳回值,

括号裡面的f:(Int)=>B代表傳入一個參數,這個參數類型是Int類型,這個函數的傳回值是B類型的

後面的implicit ord:Ordering[B]這個是排序的規則

話不多說,上代碼案例

第一個案例是對一個整數型的list進行排序

@Test

def testInt(): Unit ={

  var list = List(1,2,3,6,4,8,9,0)

  println(list.sortBy(sortIntRule))

}

def sortIntRule(i:Int) ={

   i match {

     case 1=> 2

     case 2=> 1

     case 3=> 4

     case _=> 0

   }

}

這個排序的規則是,傳入這個函數,必須隻有一個Int類型的參數,然後進行類型比對,遇到1了按照2進行排序,遇到2了按照1進行

排序,這樣真正排序下來是2再到1,遇到3了按照4開始排序,其他的都按照0排序,也就是最小的,這樣的意思就是除了1,2,3的其

他資料都是按照0排序,也就是最小的,在這個LIST中應該6,4,8,9,0,然後接下來按照模式比對後的順序排序,也就是1,2,4,

對應list裡面的2,1,3,總的排序結果就是6,4,8,9,0,2,1,3

scala神奇的sortBy方法

測試結果如上圖

第二個案例是對對象進行排序

首先我定義了一個person類,并有預設傳參,這裡變量為大寫主要是為了不沖突

package exercise.dto

class Person(age:Int,name:String,salary:Int) {
  var AGE = age
  var NAME = name
  var SALARY = salary


  override def toString = s"Person($AGE, $NAME, $SALARY)"
}      

然後寫他的測試方法

@Test
def TestSortBy(): Unit = {
  val personOne = new Person(18, "zhangsan", 10000)
  val personTwoA = new Person(20, "lisiA", 9000)
  val personTwoB = new Person(20, "lisiB", 10000)
  val personThree = new Person(15, "wangwu", 8000)
  var list = new ListBuffer[Person]
  list.+=(personOne, personTwoA,personTwoB, personThree)
  println(list.sortBy(sortRule)(Ordering.Tuple2(Ordering.Int.reverse, Ordering.Int.reverse)))
}

def sortRule(person: Person): (Int, Int) = {
  (person.AGE, person.SALARY)
}      

這裡我傳入的函數是sortRule,這個函數的意思是根據person對象的年齡和薪水進行排序,如果年齡出現一樣的再按照薪水進行排序

然後後面的Ording,Tuple2(Ordering.Int.reverse,Ordering.Int.reverse)意思是有兩個參數的元組,第一個Int型的按照從大到小排序,

reverse指從大到小排序,第二個也是從大到小排序,預設是從小到大的排序。

scala神奇的sortBy方法

執行結果如上圖,

希望對大家有所幫助哦