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