Scala-将Seq[Int]转换为一个由Seq中的数字组成的数字

Scala-将Seq[Int]转换为一个由Seq中的数字组成的数字,scala,functional-programming,seq,Scala,Functional Programming,Seq,在Scala中,如何将Seq[Int]转换为由Seq中的数字组成的单个数字 e、 g Seq(2,3,45,10)到234510作为一个数字 一个简单的方法是 Seq(2,3,45,10).mkString.toLong 是否有一种更好、也许更有效的方法 Seq(2,3,45,10).reduce((x,y) => x * math.pow(10,math.floor(math.log10(y)) + 1).toInt + y) 或 但实际上,我认为\uuuuu.mkString.to

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

e、 g

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

一个简单的方法是

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

是否有一种更好、也许更有效的方法

Seq(2,3,45,10).reduce((x,y) =>  x * math.pow(10,math.floor(math.log10(y)) + 1).toInt + y)

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

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

我认为,就性能而言,您建议的方法非常好。它也是纯功能性的,所以我不会因为它而失眠。我认为它是O(n),所以应该可以。感谢@zoltanin加法-关于性能,只有当数字太多时,才会出现内存问题,但在遇到
OutOfMemoryException
@Zoltan之前很久,您就会达到
Long
9223372036854775807
)所代表的最大数字,我同意。在这种情况下,我可能会求助于BigDecimal。请注意,这种方法不是完全的。它将以负数失败,如下所示:
scala>Seq(666,-6,5).mkString.toLong java.lang.NumberFormatException:对于输入字符串:“666-65”
BigInt(Seq(0x2,0x3,0x45,0x10).map(BigInt(_).toString(16)).mkString, 16)
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))
}