你想要做的是:
datapoints.sortby(_.keys)
这显然是行不通的。当我们看一下"sortby"的签名时,就会变得很明显为什么它不能工作:
sortBy[B](f: (A) ⇒ B)(implicit ord: math.Ordering[B]): List[A]
您的B
是一个List[String]
,而且您没有Ordering[List[String]]
的实例。那么我们该怎么办呢?我们提供一个!
为此,我们需要实现该方法:
def compare(x: T, y: T): Int
我们希望按照以下方式进行比较:
- 如果两个项之间的第一个键不同,则使用该键进行排序
- 否则,按列表的其余部分进行排序
- 如果其中一个列表为空,则另一个列表排在前面[1]
我们这里的T是字符串,但是对于T来说,我们只需要可比较性,所以我们可以更加通用。
def listOrdering[T](implicit ord: Ordering[T]): Ordering[List[T]] = new Ordering[List[T]] {
def compare(x: List[T], y: List[T]): Int = {
(x, y) match {
case (Nil, Nil) => 0
case (Nil, _) => -1
case (_, Nil) => 1
case (xhead :: xtail, yhead :: ytail) => {
val headdiff = ord.compare(xhead, yhead)
if (headdiff == 0) compare(xtail, ytail)
else (headdiff )
}
}
}
}
现在我们可以明确地向sortby方法提供排序方式:
datapoints.sortby(_.keys)(listOrdering)
或者在隐式范围内提供它们。
[1]: 您表示这种情况从未发生,因此任何选择都足够好。