Scala中的排序与自定义排序

73 阅读3分钟

排序

1. 主方法定义

def main(args: Array[String]): Unit = { ... }

这是 Scala 程序的入口方法,args用于接收命令行参数,Unit表示方法无返回值

2. 对数值数组排序

// 定义包含正负整数的数组
val arr = Array(-1, 10, -2, 1, 2, 3).sorted
// 遍历打印排序后的结果
arr.foreach(println)
  • sorted是 Scala 集合的排序方法,对于数值类型(如Int),默认按照从小到大的自然顺序排序。

  • 原数组为 [-1, 10, -2, 1, 2, 3],排序后结果为 [-2, -1, 1, 2, 3, 10]

3. 对字符串数组排序

// 定义字符串数组并排序
var arr2 = Array("zoom", "bus", "apple", "banana", "car").sorted
// 遍历打印排序后的结果
arr2.foreach(println)
  • 对于字符串类型,sorted默认按照字典顺序  排序

  • 原数组为 ["zoom", "bus", "apple", "banana", "car"],排序后结果为 ["apple", "banana", "bus", "car", "zoom"]

  • 最终打印结果

总结

sorted方法是 Scala 中对集合进行排序的便捷方法,其排序规则由元素类型的默认顺序决定:

  • 数值类型:按数值大小升序排列
  • 字符串类型:按字典顺序排列
下面是整体代码
//sorted:排序

def main(args: Array[String]): Unit = {

  // 对数值元素排序: 从小到大排序
  val arr = Array(-1,10,-2,1,2,3).sorted
  arr.foreach(println)

  //对字符元素排序,字典顺序
  var arr2 = Array("zoom","bus","apple","banana","car").sorted

  arr2.foreach(println)
}

自定义排序

1. 方法:sortWith

sortWith 是 Scala 中数组的一个排序方法,用于自定义排序规则它接收一个匿名函数 (x, y) => 布尔值 作为参数,规则是:

  • 当函数返回 true 时,x 排在 y 前面
  • 当函数返回 false 时,y 排在 x 前面

2. 排序规则解析

代码中传入的排序函数是:

(x, y) => Math.abs(x - 1) < Math.abs(y - 1)
  • Math.abs(x - 1) 计算元素 x 与数字 1 的距离(绝对值,保证距离非负)
  • 整个函数的含义是:如果 x 到 1 的距离小于 y 到 1 的距离,则 x 排在 y 前面,否则 y 排在前面。

3. 原数组与计算过程

原数组为:Array(-1, 10, -2, 1, 2, 3)

先计算每个元素到 1 的距离:

  • -1 到 1 的距离:| -1 - 1 | = 2
  • 10 到 1 的距离:| 10 - 1 | = 9
  • -2 到 1 的距离:| -2 - 1 | = 3
  • 1 到 1 的距离:| 1 - 1 | = 0
  • 2 到 1 的距离:| 2 - 1 | = 1
  • 3 到 1 的距离:| 3 - 1 | = 2

4. 排序结果

按照距离从小到大排序后,数组元素顺序为:

1 (距离0)→ 2(距离1)→ -1(距离2)→ 3(距离2)→ -2(距离3)→ 10(距离9)

arr.foreach(println) 会依次打印排序后的元素

下面是整体代码
//sorWith:自定义排序
//sorWith((x,y)=> 布尔值)
//(1) 如果返回值是true,那么x就在y的前面
//(2) 如果返回值是false,那么x就在y的后面

def main(args: Array[String]): Unit = {

  // 对数值元素排序: 按照距离1这个点的距离的从小到大排序
  val arr = Array(-1,10,-2,1,2,3).sortWith((x,y) => Math.abs(x - 1) < Math.abs(y - 1) )

  arr.foreach(println)
}