繁体   English   中英

Scala中的订购工作方式

[英]How Ordering works in 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]])方法。 是否可以在Java代码中调用compareTo?

是。 java.util.Arrays.sort方法采用Comparator,Ordering对其进行了扩展。 compare方法被称为由所使用的TimSort算法中sort方法。

答案是“是”。 如果您还对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

下面是采用Comparator的Java sort方法。 由于Ordering也是Comparator因为Ordering扩展了Comparator 通过显式类型转换将Ordering作为参数传递给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);
    }
}

简短回答:

如果您以前使用过Java,那么您会知道它包含与Scala的Ordering- Comparator类似的概念,显然没有隐式功能。

另外,如果您查看Ordering [T]的定义,您会发现它扩展了java Comparator [T]接口。

因此,在调用java.util.Arrays.sort时,执行的执行过程就好像此调用来自使用Comparator的Java代码一样。 如果查看java.util.Arrays.sort,您将看到它依次调用TimSort.sort-,后者依次调用TimsSort.binarySort,在该处实际实现算法(并调用.compare)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM