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]])
注意,
排序
是类型转换到
比较器
。Java
sort
方法采用
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);
    }
}
下面是Java
sort
方法,它采用
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);
    }
}
下面是Java
sort
方法,它采用
Comparator
。As
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);
    }
}

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)