gpt4 book ai didi

Int 和 Long 的 Scala 中值函数

转载 作者:行者123 更新时间:2023-12-05 02:15:23 25 4
gpt4 key购买 nike

我是 scala 语言的新手,正在尝试实现对 Int 和 Long 都适用的中值函数,这就是我尝试做的事情:

 def getMedian[T: Numeric](seq: Seq[T]): T = {
val sortedSeq = seq.sortWith(_ < _)
if (seq.size % 2 == 1) sortedSeq(sortedSeq.size / 2) else {
val (up, down) = sortedSeq.splitAt(seq.size / 2)
(up.last + down.head) / 2
}
}

但是比较运算符对数字类无效。我该怎么做才能做到这一点。

最佳答案

结果类型有问题。如果将一个整数除以 2,结果不一定是整数。但是谁来决定结果的精度呢?应该是 Double 吗?或者 Float 是否足够接近?

这是一个解决方案,您必须明确指定结果类型:

def getMedian[T: Ordering, F]
(seq: Seq[T])
(implicit conv: T => F, f: Fractional[F]): F = {
val sortedSeq = seq.sorted
if (seq.size % 2 == 1) sortedSeq(sortedSeq.size / 2) else {
val (up, down) = sortedSeq.splitAt(seq.size / 2)
import f._
(conv(up.last) + conv(down.head)) / fromInt(2)
}
}

您现在可以按如下方式使用它:

println(getMedian[Int, Float](List(1,2,3,4)))
println(getMedian[Int, Double](List(1,2,3,4)))

两次输出2.5,但第一次是单精度,而最后一次是 double 计算。

当你这样做的时候,你可以实现一个 O(n) selection algorithm例如quickselect ,并使用 T: Ordering 来比较元素。这些算法都不依赖于任何算术运算。

关于Int 和 Long 的 Scala 中值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51901180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com