需要从头实现吗?我找不到匹配的隐式方法,即使在最后的“Implicits”特质中也没有。显然,“seqDerivedOrdering”不起作用,因为“Array”不是“Seq”。
需要从头实现吗?我找不到匹配的隐式方法,即使在最后的“Implicits”特质中也没有。显然,“seqDerivedOrdering”不起作用,因为“Array”不是“Seq”。
val o = new math.Ordering[Array[Byte]] {
def compare(a: Array[Byte], b: Array[Byte]): Int = {
if (a eq null) {
if (b eq null) 0
else -1
}
else if (b eq null) 1
else {
val L = math.min(a.length, b.length)
var i = 0
while (i < L) {
if (a(i) < b(i)) return -1
else if (b(i) < a(i)) return 1
i += 1
}
if (L < b.length) -1
else if (L < a.length) 1
else 0
}
}
}
.toSeq
将其打包成WrappedArray
并推迟到Seq比较而不是进行自己的扫描。 (这将导致字节的装箱和拆箱,因此效率不高。由于字节装箱通常是通过查找所有字节的表来完成的,所以它并不是非常低效,因此除非您正在进行例如重型二进制文件处理之类的操作,否则可能可以获得成功。)scala> Ordering.by((_: Array[Byte]).toIterable)
res0: scala.math.Ordering[Array[Byte]] = scala.math.Ordering$$anon$7@8c9f531
您可以实现一个非常简单的Ordering
,它在比较数组时调用toSeq
,然后调用seqDerivedOrdering
。将其转换为Seq应该在性能方面几乎是免费的。
Array
对象为每种类型实现这些功能就太好了。也许有人应该提交一个增强请求?但与此同时,标准库中确实有很多方便的东西是没有的。你应该习惯使用自己的个人标准库来填补需要的那些部分! - Rex Kerr<
,而Ordering
不是专业化的,因此您不能仅仅推迟到该方法。所以你必须创建自己的特殊版本Numeric
并从那里开始工作。 - Rex Kerr