gpt4 book ai didi

scala - List[Int] => Int 没有字符串转换?

转载 作者:行者123 更新时间:2023-12-02 06:52:50 26 4
gpt4 key购买 nike

我想出了以下方法来转换 List[Int] => Try[BigDecimal]:

import scala.util.Try

def f(xs: List[Int]): Try[BigDecimal] =
Try { xs.mkString.toInt }.map ( BigDecimal(_) )

例子:

scala> f(List(1,2,3,4))
res4: scala.util.Try[BigDecimal] = Success(1234)

scala> f(List(1,2,3,55555))
res5: scala.util.Try[BigDecimal] = Success(12355555)

有没有一种方法可以在不求助于字符串转换步骤的情况下编写此函数?

最佳答案

不是很漂亮,而且我不相信它会更有效率。这是基本大纲。

val pwrs:Stream[BigInt] = 10 #:: pwrs.map(_ * 10)
List(1,2,3,55555).foldLeft(0:BigInt)((p,i) => pwrs.find(_ > i).get * p + i)

此处的错误处理更加充实。

import scala.util.Try
def f(xs: List[Int]): Try[BigDecimal] = Try {

lazy val pwrs: Stream[BigDecimal] = 10 #:: pwrs.map(_ * 10)
xs.foldLeft(0: BigDecimal) {
case (acc, i) if i >= 0 => pwrs.find(_ > i).get * acc + i
case _ => throw new Error("bad")
}
}

更新

为了好玩,我想我应该将一些代码插入 Rex Kerr 方便的基准测试/分析工具,Thyme .

代码

import scala.util.Try

def fString(xs: List[Int]): Try[BigInt] = Try { BigInt(xs.mkString) }

def fStream(xs: List[Int]): Try[BigInt] = Try {
lazy val pwrs: Stream[BigInt] = 10 #:: pwrs.map(_ * 10)
xs.foldLeft(0: BigInt) {
case (acc, i) if i >= 0 => pwrs.find(_ > i).get * acc + i
case _ => throw new Error("bad")
}
}

def fLog10(xs: List[Int]): Try[BigInt] = Try {
xs.foldLeft(0: BigInt) {
case (acc, i) if i >= 0 =>
math.pow(10, math.ceil(math.log10(i))).toInt * acc + i
case _ => throw new Error("bad")
}
}

fString() 是对 Kevin 的原始问题的轻微简化。 fStream() 是我提议的非字符串实现。 fLog10 与 Alexey 建议的增强功能相同。

您会注意到我使用的是 BigInt 而不是 BigDecimal。我发现这两种非字符串方法都在结果的第 37 位附近的某个地方遇到了错误。某种舍入错误之类的,但是 BigInt 没有问题,所以这就是我使用的。

测试设置

// create a List of 40 Ints and check its contents
val lst = List.fill(40)(util.Random.nextInt(20000))
lst.min // 5
lst.max // 19858
lst.mkString.length // 170

val th = ichi.bench.Thyme.warmed(verbose = print)
th.pbenchWarm(th.Warm(fString(lst)), title="fString")
th.pbenchWarm(th.Warm(fStream(lst)), title="fStream")
th.pbenchWarm(th.Warm(fLog10(lst)), title="fLog10")

结果

Benchmark for fString (20 calls in 345.6 ms) Time: 4.015 us 95% CI 3.957 us - 4.073 us (n=19) Garbage: 109.9 ns (n=2 sweeps measured)

Benchmark for fStream (20 calls in 305.6 ms) Time: 7.118 us 95% CI 7.024 us - 7.213 us (n=19) Garbage: 293.0 ns (n=3 sweeps measured)

Benchmark for fLog10 (20 calls in 382.8 ms) Time: 9.205 us 95% CI 9.187 us - 9.222 us (n=17) Garbage: 73.24 ns (n=2 sweeps measured)

所以我对非字符串算法的效率的看法是正确的。奇怪的是,使用 math._ 来避免创建 Stream 似乎并没有更好。我没想到。

外卖

数字到字符串和字符串到数字的转换相当高效。

关于scala - List[Int] => Int 没有字符串转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39283195/

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