scala 排序接口Ordering
在 Scala 中,排序接口 Ordering 定义了一个用于比较两个对象的方法。该接口提供了一种通用的方式来比较不同类型的对象,并允许你在排序时传递比较函数。
Ordering 接口定义了三个方法:
compare(a: A, b: A): Int - 比较两个对象 a 和 b,返回一个整数表示它们之间的关系。如果 a 小于 b,则返回一个负整数;如果 a 等于 b,则返回 0;如果 a 大于 b,则返回一个正整数。
lt(a: A, b: A): Boolean - 判断对象 a 是否小于对象 b。
gt(a: A, b: A): Boolean - 判断对象 a 是否大于对象 b。
通常情况下,你只需要实现 compare 方法即可。如果你需要自定义排序规则,可以创建一个继承自 Ordering 的类,并实现 compare 方法。
例如,如果你有一个 Person 类型,你可以创建一个 PersonOrdering 类来定义一个按照年龄升序排序的比较函数:
case class Person(name: String, age: Int)
object PersonOrdering extends Ordering[Person] {
def compare(a: Person, b: Person) = a.age - b.age
}
现在,你可以使用 PersonOrdering 对象来对 Person 对象进行排序:
val people = List(Person("Alice", 25), Person("Bob", 30), Person("Charlie", 20))
val sortedPeople = people.sorted(PersonOrdering)
在上面的例子中,sorted 方法使用了我们定义的 PersonOrdering 对象来进行排序,结果将按照年龄升序排列。
Ordering 特质入门简介
排序是一种trait,其每个实例代表一种对类型实例进行排序的策略。
trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
outer =>
/** Returns an integer whose sign communicates how x compares to y.
*
* The result sign has the following meaning:
*
* - negative if x < y
* - positive if x > y
* - zero otherwise (if x == y)
*/
def compare(x: T, y: T): Int
看一下其实现类,比如String类型,其实最终是调用了java中String类compareTo方法
trait StringOrdering extends Ordering[String] {
def compare(x: String, y: String) = x.compareTo(y)
}
implicit object String extends StringOrdering
看一下应用.以sortBy为例,这里的隐式参数就是调用了这个
def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr
举例说明
scala> val x=List("a","d","c")
x: List[String] = List(a, d, c)
//第二个参数为隐式参数,可以传,也可以不传,这里传只是为了说明问题
scala> x.sortBy(x=>x)(Ordering[String])
res14: List[String] = List(a, c, d)
//隐式参数传错无效
scala> x.sortBy(x=>x)(Ordering[Int])
<console>:27: error: type mismatch;
found : scala.math.Ordering[Int]
required: scala.math.Ordering[String]
x.sortBy(x=>x)(Ordering[Int])
^
//隐式参数使用时无需传递
scala> x.sortBy(x=>x)
res16: List[String] = List(a, c, d)