Scala中的排序工作原理
我创建了以下类和一个实现排序的对象Scala中的排序工作原理,scala,Scala,我创建了以下类和一个实现排序的对象 //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 sam
//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)
我试图理解函数compare在sortBy中的用法。查看SeqLike.scala的源代码,sortBy方法调用sorted方法,后者调用java.util.Arrays.sort方法(arr,ord.asInstanceOf[Ordering[Object]])。compareTo是否在Java代码中被调用?是。
java.util.Arrays.sort
方法采用一个比较器,排序扩展了比较器。compare
方法在sort
方法使用的TimSort算法中调用。是。java.util.Arrays.sort
方法采用一个比较器,排序扩展了比较器。compare
方法在sort
方法使用的TimSort算法中被调用。答案是“是”。如果您对java代码也有更多的了解,您就会理解这一点
下面是Scala方法中的调用sorted
java.util.Arrays.sort(arr, ord.asInstanceOf[Ordering[Object]])
注意,排序
是类型转换到比较器
。Javasort
方法采用Comparator
下面是排序的实现
trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
outer =>
....
}
注意排序
扩展了比较器
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);
}
}
下面是Javasort
方法,它采用Comparator
。As排序
也是一个比较器
,因为排序
扩展了比较器
<代码>排序通过显式类型转换作为参数传递给比较器
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);
}
}
publicstaticvoidsort(T[]a,Comparator答案是“是的”。如果您对java代码也有更多的了解,您就会理解这一点
下面是Scala方法中的调用sorted
java.util.Arrays.sort(arr, ord.asInstanceOf[Ordering[Object]])
注意,排序
是类型转换为比较器
。Java排序
方法采用比较器
下面是排序的实现
trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
outer =>
....
}
注意排序
扩展了比较器
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);
}
}
下面是Javasort
方法,它采用Comparator
。AsOrdering
也是一个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);
}
}
publicstaticvoidsort(T[]a,Comparator简短回答:YES
如果您以前使用过Java,您就会知道它包含一个与Scala的排序类似的概念-Comparator,显然没有隐含的功能
另外,如果您查看排序[T]的定义,您将看到它扩展了java Comparator[T]接口
因此,在调用java.util.Arrays.sort时,执行的过程与使用比较器从java代码调用的过程完全相同。如果查看java.util.Arrays.sort,您将看到它依次调用TimsSort.sort,然后在实际实现算法的地方调用TimsSort.binarySort(并调用.compare).简短回答:是
如果您以前使用过Java,您就会知道它包含一个与Scala的排序类似的概念-Comparator,显然没有隐含的功能
另外,如果您查看排序[T]的定义,您将看到它扩展了java Comparator[T]接口
因此,在调用java.util.Arrays.sort时,执行的过程与使用比较器从java代码调用的过程完全相同。如果查看java.util.Arrays.sort,您将看到它依次调用TimsSort.sort,然后在实际实现算法的地方调用TimsSort.binarySort(并调用.compare)