在 Scala 中对数组进行排序

Suraj P 2023年1月30日 2022年7月12日
  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 对数据进行了升序排序。

Author: 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