2011-08-26 9 views
4

Total newbie question here ... Сегодня, пытаясь вычислить сумму списка целых чисел (фактически BitSet), я столкнулся с сценариями переполнения и заметил, что тип возврата (сумма/product) является Int. Существуют ли какие-либо методы в Range/List для суммирования или умножения всех значений на Long?уменьшить список целых чисел/диапазон целых чисел в scala

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

благодаря

ответ

9

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

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

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

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

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

+0

Мне нравится второй. благодаря.. – Ajay

2

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

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

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

val x = 1 to Int.MaxValue 
println(x.foldLeft(0L)(_+_)) 
2

Сравнить:

>> 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 преобразуетс автоматически). Конечно, сумма последовательной целочисленной последовательности имеет очень хорошую дискретную формулу:

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

+1

Посмотрите на https: // i ssues.scala-lang.org/browse/SI-4658 для дальнейшего улучшения. :-) – soc

+0

@soc Очень приятно, что он делает это std :) –

Смежные вопросы