scala 排序接口Ordering

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值