2016-12-14 151 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)。