Packages

trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable

Ordering is a trait whose instances each represent a strategy for sorting instances of a type.

Ordering's companion object defines many implicit objects to deal with subtypes of AnyVal (e.g. Int, Double), String, and others.

To sort instances by one or more member variables, you can take advantage of these built-in orderings using Ordering.by and Ordering.on:

import scala.util.Sorting
val pairs = Array(("a", 5, 2), ("c", 3, 1), ("b", 1, 3))

// sort by 2nd element
Sorting.quickSort(pairs)(Ordering.by[(String, Int, Int), Int](_._2))

// sort by the 3rd element, then 1st
Sorting.quickSort(pairs)(Ordering[(Int, String)].on(x => (x._3, x._1)))

An Ordering[T] is implemented by specifying compare(a:T, b:T), which decides how to order two instances a and b. Instances of Ordering[T] can be used by things like scala.util.Sorting to sort collections like Array[T].

For example:

import scala.util.Sorting

case class Person(name:String, age:Int)
val people = Array(Person("bob", 30), Person("ann", 32), Person("carl", 19))

// sort by age
object AgeOrdering extends Ordering[Person] {
  def compare(a:Person, b:Person) = a.age compare b.age
}
Sorting.quickSort(people)(AgeOrdering)

This trait and scala.math.Ordered both provide this same functionality, but in different ways. A type T can be given a single way to order itself by extending Ordered. Using Ordering, this same type may be sorted in many other ways. Ordered and Ordering both provide implicits allowing them to be used interchangeably.

You can import scala.math.Ordering.Implicits to gain access to other implicit orderings.

Self Type
Ordering[T]
Annotations
@implicitNotFound(msg = "No implicit Ordering defined for ${T}.")
Source
Ordering.scala
See also

scala.math.Ordered, scala.util.Sorting

Type Hierarchy
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. Ordering
  2. PartialOrdering
  3. Equiv
  4. Serializable
  5. Comparator
  6. AnyRef
  7. Any
Implicitly
  1. by any2stringadd
  2. by StringFormat
  3. by Ensuring
  4. by ArrowAssoc
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. Protected

Type Members

  1. class OrderingOps extends AnyRef

    This inner class defines comparison operators available for T.

Abstract Value Members

  1. abstract def compare(x: T, y: T): Int

    Returns an integer whose sign communicates how x compares to y.

    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)
    Definition Classes
    Ordering → Comparator

Concrete Value Members

  1. def equiv(x: T, y: T): Boolean

    Return true if x == y in the ordering.

    Return true if x == y in the ordering.

    Definition Classes
    OrderingPartialOrderingEquiv
  2. def gt(x: T, y: T): Boolean

    Return true if x > y in the ordering.

    Return true if x > y in the ordering.

    Definition Classes
    OrderingPartialOrdering
  3. def gteq(x: T, y: T): Boolean

    Return true if x >= y in the ordering.

    Return true if x >= y in the ordering.

    Definition Classes
    OrderingPartialOrdering
  4. def isReverseOf(other: Ordering[_]): Boolean

    Returns whether or not the other ordering is the opposite ordering of this one.

    Returns whether or not the other ordering is the opposite ordering of this one.

    Equivalent to other == this.reverse.

    Implementations should only override this method if they are overriding reverse as well.

  5. def lt(x: T, y: T): Boolean

    Return true if x < y in the ordering.

    Return true if x < y in the ordering.

    Definition Classes
    OrderingPartialOrdering
  6. def lteq(x: T, y: T): Boolean

    Return true if x <= y in the ordering.

    Return true if x <= y in the ordering.

    Definition Classes
    OrderingPartialOrdering
  7. def max[U <: T](x: U, y: U): U

    Return x if x >= y, otherwise y.

  8. def min[U <: T](x: U, y: U): U

    Return x if x <= y, otherwise y.

  9. implicit def mkOrderingOps(lhs: T): OrderingOps

    This implicit method augments T with the comparison operators defined in scala.math.Ordering.Ops.

  10. def on[U](f: (U) => T): Ordering[U]

    Given f, a function from U into T, creates an Ordering[U] whose compare function is equivalent to:

    Given f, a function from U into T, creates an Ordering[U] whose compare function is equivalent to:

    def compare(x:U, y:U) = Ordering[T].compare(f(x), f(y))
  11. def orElse(other: Ordering[T]): Ordering[T]

    Creates an Ordering[T] whose compare function returns the result of this Ordering's compare function, if it is non-zero, or else the result of others compare function.

    Creates an Ordering[T] whose compare function returns the result of this Ordering's compare function, if it is non-zero, or else the result of others compare function.

    other

    an Ordering to use if this Ordering returns zero

    Example:
    1. case class Pair(a: Int, b: Int)
      
      val pairOrdering = Ordering.by[Pair, Int](_.a)
                                 .orElse(Ordering.by[Pair, Int](_.b))
  12. def orElseBy[S](f: (T) => S)(implicit ord: Ordering[S]): Ordering[T]

    Given f, a function from T into S, creates an Ordering[T] whose compare function returns the result of this Ordering's compare function, if it is non-zero, or else a result equivalent to:

    Given f, a function from T into S, creates an Ordering[T] whose compare function returns the result of this Ordering's compare function, if it is non-zero, or else a result equivalent to:

    Ordering[S].compare(f(x), f(y))

    This function is equivalent to passing the result of Ordering.by(f) to orElse.

    Example:
    1. case class Pair(a: Int, b: Int)
      
      val pairOrdering = Ordering.by[Pair, Int](_.a)
                                 .orElseBy[Int](_.b)
  13. def reverse: Ordering[T]

    Return the opposite ordering of this one.

    Return the opposite ordering of this one.

    Implementations overriding this method MUST override isReverseOf as well if they change the behavior at all (for example, caching does not require overriding it).

    Definition Classes
    OrderingPartialOrdering
  14. def reversed(): Comparator[T]
    Definition Classes
    Comparator
  15. def thenComparing[U <: Comparable[_ >: U <: AnyRef]](arg0: java.util.function.Function[_ >: T <: AnyRef, _ <: U]): Comparator[T]
    Definition Classes
    Comparator
  16. def thenComparing[U <: AnyRef](arg0: java.util.function.Function[_ >: T <: AnyRef, _ <: U], arg1: Comparator[_ >: U <: AnyRef]): Comparator[T]
    Definition Classes
    Comparator
  17. def thenComparing(arg0: Comparator[_ >: T <: AnyRef]): Comparator[T]
    Definition Classes
    Comparator
  18. def thenComparingDouble(arg0: ToDoubleFunction[_ >: T <: AnyRef]): Comparator[T]
    Definition Classes
    Comparator
  19. def thenComparingInt(arg0: ToIntFunction[_ >: T <: AnyRef]): Comparator[T]
    Definition Classes
    Comparator
  20. def thenComparingLong(arg0: ToLongFunction[_ >: T <: AnyRef]): Comparator[T]
    Definition Classes
    Comparator
  21. def tryCompare(x: T, y: T): Some[Int]

    Returns whether a comparison between x and y is defined, and if so the result of compare(x, y).

    Returns whether a comparison between x and y is defined, and if so the result of compare(x, y).

    Definition Classes
    OrderingPartialOrdering