[英]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.