Scala - Преобразуйте Seq [Int] в одно число, состоящее из чисел в Seq

Как в Scala преобразовать Seq [Int] в одно число, состоящее из чисел в Seq.

e.g.

От Seq(2,3,45,10) до 234510 в виде числа

Простой метод

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

Есть ли лучший и, возможно, более производительный / функциональный способ?


person Sid    schedule 27.10.2015    source источник
comment
Я бы сказал, что с точки зрения производительности предложенный вами метод очень хорош. Он также чисто функциональный, так что я бы не потерял из-за него сон.   -  person Zoltán    schedule 27.10.2015
comment
Я думаю, что это O (n), так что все должно быть в порядке. Спасибо @ Zoltán   -  person Sid    schedule 27.10.2015
comment
Кроме того, что касается производительности, у вас могут быть проблемы с памятью, только если у вас слишком много цифр, но вы достигнете максимального числа, представленного Long (9,223,372,036,854,775,807), задолго до того, как столкнетесь с OutOfMemoryException.   -  person Zoltán    schedule 27.10.2015
comment
@Zoltan, я согласен. В этом случае я бы, вероятно, обратился к BigDecimal.   -  person Sid    schedule 27.10.2015
comment
Обратите внимание, что этот подход не тотальный. Ошибка с отрицательным числом, например: scala> Seq(666, -6, 5).mkString.toLong java.lang.NumberFormatException: For input string: "666-65"   -  person Kevin Meredith    schedule 27.10.2015
comment
Правильно, @KevinMeredith. Я предполагаю, что Seq будет положительным целым числом.   -  person Sid    schedule 28.10.2015


Ответы (1)


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

or

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)
person Odomontois    schedule 27.10.2015