уменьшить список целых чисел / диапазон целых чисел в Scala - PullRequest
4 голосов
/ 26 августа 2011

Всего вопросов новичка здесь ... Сегодня, пытаясь вычислить сумму списка целых чисел (на самом деле BitSet), я столкнулся со сценариями переполнения и заметил, что тип возвращаемого значения (сумма / произведение) - Int. Есть ли какие-либо методы в Range / List для суммирования или, скажем, умножения всех значений на Long?

val x = 1 to Integer.MaxValue
println(x.sum) //prints -1453759936

спасибо

Ответы [ 4 ]

9 голосов
/ 26 августа 2011

Преобразование элементов в Long (или BigInt, если это зашло так далеко) при суммировании:

x.view.map(_.toLong).sum

Вы также можете вернуться, чтобы сбросить

x.foldLeft(0L)(_ + _)

(Примечание: если бы вы суммировали по диапазону, возможно, было бы лучше немного подсчитать, но я понимаю, что это не то, что вы на самом деле сделали)

2 голосов
/ 26 августа 2011

Сравнить:

>> val x = 1 to Int.MaxValue
x: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(...)

С:

>> val x = 1L to Int.MaxValue
x: scala.collection.immutable.NumericRange.Inclusive[Long] = NumericRange(...)

Обратите внимание, что первый использует Int.to, а второй - Long.to (где Int.MaxValue преобразуется с повышением частотыавтоматически).Конечно, сумма последовательной целочисленной последовательности имеет очень хорошую дискретную формулу:)

Счастливое кодирование.

2 голосов
/ 26 августа 2011

Это не очень эффективно, но самый простой способ:

val x = 1L to Int.MaxValue
println(x.sum) //prints 2305843008139952128

Если вам нужно, чтобы x содержал Ints, а не Longs, вы можете сделать

val x = 1 to Int.MaxValue
println(x.foldLeft(0L)(_+_))
1 голос
/ 26 августа 2011
Range.Long(1, Int.MaxValue, 1).sum
...