【问题标题】:Scala - Convert Seq[Int] to a single number consisting numbers in the SeqScala - 将 Seq[Int] 转换为由 Seq 中的数字组成的单个数字
【发布时间】:2025-12-27 12:25:15
【问题描述】:

在 Scala 中,如何将 Seq[Int] 转换为由 Seq 中的数字组成的单个数字。

例如

Seq(2,3,45,10)234510 作为数字

一个简单的方法是

Seq(2,3,45,10).mkString.toLong

有没有更好、或许更高效/功能更强大的方法?

【问题讨论】:

  • 我认为就性能而言,您建议的方法非常好。它也纯粹是功能性的,所以我不会为此失眠。
  • 我认为这是一个 O(n) 所以应该没问题。谢谢@Zoltán
  • 另外 - 关于性能,如果你有太多数字,你只会有内存问题,但你会在遇到Long (9,223,372,036,854,775,807) 表示的最大数字之前遇到OutOfMemoryException.
  • @Zoltan,我同意。在那种情况下,我可能会求助于 BigDecimal。
  • 请注意,这种方法并非全部。它会以负数失败,如下所示:scala> Seq(666, -6, 5).mkString.toLong java.lang.NumberFormatException: For input string: "666-65"

标签: scala functional-programming seq


【解决方案1】:
Seq(2,3,45,10).reduce((x,y) =>  x * math.pow(10,math.floor(math.log10(y)) + 1).toInt + y)

Seq(2,3,45,10).map(BigDecimal(_)).reduce((x,y) =>  x * BigDecimal(10).pow(y.precision) + y)

但实际上我认为_.mkString.toLong 是性能最高的,唯一的问题是它只适用于十进制表示。对于任意基数,您可以这样做

BigInt(Seq(0x2,0x3,0x45,0x10).map(BigInt(_).toString(16)).mkString, 16)

【讨论】:

    【解决方案2】:
    def toNumber(seq:Seq[Int]):Int = {    
      def append(scale:Int)(n:Int, m:Int):Int = if(m>=scale) append(scale*10)(n, m) else n*scale + m
    
      seq.foldLeft(0)(append(1))
    }
    

    【讨论】: