簡體   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