2016-12-14 56 views
0

如何訂購作品,我創建了下面的類並實現訂貨在斯卡拉

//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代碼中調用?

回答

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的實施。

以下是採用Comparator的Java sort方法。因爲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); 
    } 
} 
4

是的。 java.util.Arrays.sort方法採用比較器,該順序擴展。在sort方法使用的TimSort算法中調用compare方法。

0

簡短的回答:

如果你使用Java工作過,你就會知道,它包含一個呈三角概念Scala的訂貨 - 比較,顯然沒有隱含的功能。另外,如果你看看Ordering [T]的定義,你會看到它擴展了java Comparator [T]接口。

因此,在調用java.util.Arrays.sort時,執行的過程與使用Comparator從java代碼中調用該進程完全相同。如果您查看java.util.Arrays.sort,您會看到它依次調用TimSort.sort,後者依次調用TimsSort.binarySort,其中實際實現了該算法(並調用了.compare)。