在 Scala 中對陣列進行排序

Suraj P 2023年1月30日
  1. 在 Scala 中使用 sorted 方法對陣列進行排序
  2. 在 Scala 中使用 sortBy(attribute) 方法對陣列進行排序
  3. 在 Scala 中使用 sortWith 方法對陣列進行排序
在 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))

在上面的程式碼中,我們根據案例類 studentname 屬性對物件進行了排序。

在 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 對資料進行了升序排序。

作者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

相關文章 - Scala Array