如何在Scala中使用Ordering

时间:2016-12-14 11:44:26

标签: scala

我创建了以下类和一个实现Ordering

的对象
//class person
class Person (s:String, i:Int, d:Date) {
  val name = s
  override def toString = name
  val age = i
  val dob = d
}
/*
logic for how to compare two Person objects. Their names will be compared first. If names are same, then their age will be compared. If their age is also same, then their date of birth will be compared. Note that we could have used any other logic to compare two person objects.
*/

implicit object myPersonOrdering extends Ordering[Person] {
  override def compare(x: Person, y: Person) = if (x.name.compareTo(y.name) == 0) {
    if (x.age.compareTo(y.age) == 0) {
      x.dob.compareTo(y.dob)
    } else (x.age.compareTo(x.age))
  } else (x.name.compareTo(y.name))

}

//create a list of Persons
val a1 = new Person("Andy",11, new Date())
val a2 = new Person("ann",12,new Date())
val a3 = new Person("Beth",31, new Date())
val a4 = new Person("Danny",10, new Date())
val a5 = new Person("peter",1, new Date())

val la = List(a1,a2,a3,a4, a5)

la.sortBy(x=>x)

我试图了解sortBy中使用函数比较的位置。查看SeqLike.scala的源代码,方法sortBy调用方法sorted,调用方法java.util.Arrays.sort(arr,ord.asInstanceOf [Ordering [Object]])。 compareTo是否在Java代码中调用?

3 个答案:

答案 0 :(得分:4)

是。 java.util.Arrays.sort方法采用比较器,Ordering扩展。 compare方法在sort方法使用的TimSort算法中调用。

答案 1 :(得分:1)

答案是"是"。如果你对java代码有更多的了解,你会理解这一点。

以下是Scala方法sorted

中的调用
java.util.Arrays.sort(arr, ord.asInstanceOf[Ordering[Object]])

注意Ordering的类型是Comparator。 Java sort方法需要Comparator

以下是订购的实施

trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
  outer =>
 ....
}

注意Ordering延伸Comparator

以下是采用sort的Java Comparator方法。由于Ordering扩展Comparator,因此Ordering也是ComparatorOrdering通过显式类型转换为Comparator作为参数传递。

public static <T> void sort(T[] a, Comparator<? super T> c) {
    if (c == null) {
        sort(a);
    } else {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, c);
        else
            TimSort.sort(a, 0, a.length, c, null, 0, 0);
    }
}

答案 2 :(得分:0)

简答:

如果您之前使用过Java,那么您就会知道它包含了Scala的排序 - 比较器的概念,显然没有隐含的功能。< / p>

另外,如果你看一下Ordering [T]的定义,你会看到它扩展了所说的java Comparator [T]接口。

因此,在调用java.util.Arrays.sort时,执行的过程就好像这个调用来自使用Comparator的java代码一样。如果你看一下java.util.Arrays.sort,你会看到它依次调用TimSort.sort-然后调用TimsSort.binarySort实际实现算法(和.compare)。