在 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
对数据进行了升序排序。
相关文章
在 Scala 中合并两个 map,然后将具有相同键的值相加
发布时间:2023/03/24 浏览次数:163 分类:编程语言
-
本文展示了在 Scala 中合并两个 map 然后将具有相同键的值相加的不同方法