在 Scala 中對陣列進行排序
在本文中,我們將學習如何在 Scala 程式語言中對資料陣列進行排序。
排序是指根據某些條件將資料按升序或降序排列。當我們想要在大型資料集中搜尋某些內容時,這是一種非常常用的方法,因為我們可以應用二進位制搜尋演算法,該演算法僅適用於已排序的資料集。
Scala 排序方法在內部使用 TimSort,這是一種合併排序和插入排序演算法的混合體。現在,讓我們看看 Scala 中存在的三種排序方法。
在 Scala 中使用 sorted
方法對陣列進行排序
sorted
方法用於對 Scala 中的序列進行排序,如 List、Array、Vector 和 Seq。此方法返回一個按其自然順序排序的新集合。
方法定義:
def sorted[Y >:X] (implicit ord:Ordering[Y]): Repr
這裡,X
指的是我們在集合中使用的元素型別。Repr
是具有元素的實際集合的型別。
讓我們看一個例子:
object MyClass {
def main(args: Array[String]) {
val seq = Seq(12,3,78,90,1)
println(seq.sorted)
}
}
輸出:
List(1, 3, 12, 78, 90)
預設情況下,排序是按升序進行的。如果我們想按降序對資料進行排序,我們可以使用以下語法:
sorted(Ordering.DataType.reverse)
示例程式碼:
object MyClass {
def main(args: Array[String]) {
val seq = Seq(12,3,78,90,1)
println(seq.sorted(Ordering.Int.reverse))
}
}
輸出:
List(90, 78, 12, 3, 1)
如果我們想使用 sorted
方法根據案例類的某些屬性對資料進行排序,那麼我們必須擴充套件 Ordered
特徵,然後覆蓋抽象方法 compare
。在 compare
方法中,我們必須定義要對案例類的物件進行排序的屬性。
這稱為自定義資料排序,即指定我們對資料進行排序的條件。
示例程式碼:
case class student(id: Int,name: String) extends Ordered[student]
{
def compare(that: student) = this.name compare that.name
}
val obj1 = student(1, "tony")
val obj2 = student(2, "bruce")
val obj3 = student(3, "stark")
val studentList = List(obj1,obj2,obj3)
println(studentList.sorted)
輸出:
List(student(2,bruce), student(3,stark), student(1,tony))
在上面的程式碼中,我們根據案例類 student
的 name
屬性對物件進行了排序。
在 Scala 中使用 sortBy(attribute)
方法對陣列進行排序
Scala 中的 sortBy
方法可以基於一個或多個類屬性進行排序。如果我們在範圍中有 Ordering
欄位型別,則可以使用此方法。
在這裡,預設排序也是升序。
方法定義:
def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr
示例程式碼:
case class employee(id: Int, name: String, salary: Double)
val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)
val empList = List(obj1,obj2,obj3)
println(empList.sortBy(_.name))
println(empList.sortBy(_.salary))
輸出:
List(employee(2,bruce,11000.0), employee(3,stark,15000.0), employee(1,tony,12000.0))
List(employee(2,bruce,11000.0), employee(1,tony,12000.0), employee(3,stark,15000.0))
在上面的程式碼中,首先,我們根據屬性 name
列印排序後的資料,在第二個列印語句中,我們根據屬性 salary
對資料進行排序。
我們可以通過稍微調整方法來按降序對資料進行排序:
sortBy(_.attribute)(Ordering[data_type_of_attribute].reverse)
示例程式碼:
case class employee(id: Int, name: String, salary: Double)
val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)
val empList = List(obj1,obj2,obj3)
println(empList.sortBy(_.name)(Ordering[String].reverse))
輸出:
List(employee(1,tony,12000.0), employee(3,stark,15000.0), employee(2,bruce,11000.0))
我們根據上面程式碼中的 name
屬性對資料進行了排序。
這種方法對於基於多個屬性的資料排序也很有用;它通過根據第一個屬性對資料進行排序來工作。如果第一個屬性具有相同的值,則根據第二個屬性對其進行排序。
示例程式碼:
case class employee(id: Int, name: String, salary: Double)
val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)
val obj4 = employee(4,"tony",9000.0)
val obj5 = employee(5,"stark",19000.0)
val obj6 = employee(6,"tony",10000.0)
val empList = List(obj1,obj2,obj3,obj4,obj5,obj6)
println(empList.sortBy((empList =>(empList.name,empList.salary))))
在輸出中,我們可以看到如果 name
相同,則資料將根據 salary
屬性進行排序。
輸出:
List(employee(2,bruce,11000.0), employee(3,stark,15000.0), employee(5,stark,19000.0), employee(4,tony,9000.0), employee(6,tony,10000.0), employee(1,tony,12000.0))
使用這種方法,我們還可以根據第一個或第二個元素對元組
列表進行排序。下面是基於第二個元素對元組進行排序的示例。
示例程式碼:
val list = List(('b',60),('c',10),('a',40))
println(list.sortBy(_._2))
輸出:
List((c,10), (a,40), (b,60))
同樣,我們也可以根據它們的第一個元素進行排序。
示例程式碼:
val list = List(('b',60),('c',10),('a',40))
println(list.sortBy(_._1))
輸出:
List((a,40), (b,60), (c,10))
在 Scala 中使用 sortWith
方法對陣列進行排序
當我們想忘記基於給定比較函式的排序和排序元素時,sortWith(function)
非常有用。因此,我們可以傳遞任何自定義比較函式。
方法定義:
def sortWith(lt: (X, X) => Boolean): Repr
示例程式碼 1:
在這裡,我們按照工資從高到低對員工進行了排序。
case class employee(id: Int, name: String, salary: Double)
val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)
val obj4 = employee(4,"naruto",200)
val empList = List(obj1,obj2,obj3,obj4)
println(empList.sortWith(_.salary > _.salary))
輸出:
List(employee(3,stark,15000.0), employee(1,tony,12000.0), employee(2,bruce,11000.0), employee(4,naruto,200.0))
示例程式碼 2:
在這裡,我們在 sortWith
方法中傳遞我們的自定義函式。
case class employee(id: Int, name: String, salary: Double)
def sortBySalary(emp1 :employee,emp2:employee): Boolean =
{
emp1.salary < emp2.salary
}
val obj1 = employee(1,"tony",12000.00)
val obj2 = employee(2,"bruce",11000.00)
val obj3 = employee(3,"stark",15000.00)
val obj4 = employee(4,"naruto",200)
val empList = List(obj1,obj2,obj3,obj4)
println(empList.sortWith((emp1,emp2) => sortBySalary(emp1,emp2)))
輸出:
List(employee(4,naruto,200.0), employee(2,bruce,11000.0), employee(1,tony,12000.0), employee(3,stark,15000.0))
我們根據上面程式碼中的 salary
對資料進行了升序排序。