2012-05-09 8 views
3

私はScala言語が初めてです。scala Longの範囲

ロングタイプにはレンジが必要です。

ステップ1で[1、2、3 ... 10000000]のリストが必要です。/からtoまで使用すると、IntではなくLongを使用するため、エラーが発生します。

開始、終了、空のListを期待し、[start .. end]のListを生成する簡単な関数を書こうとします。私は次の行にOutOfMemoryエラーが出ますrange_l(1L, 1000000L, List())

def range_l(start : Long, end : Long, list : List[Long]) : List[Long] = { 
    if (start == end){ 
     val add_to_list = start :: list 
     return add_to_list 
    } 
    else { 
     val add_to_list = start :: list 
     range_l(start + 1, end, add_to_list) 
    } 
} 

私は同じようにそれを呼び出す場合:add_to_list = start :: list

は何が私をアドバイスすることができます。ここ

は私の関数でありますか? Range[Long]を入手するにはどうすればよいですか、または機能を最適化するにはどうすればよいですか。どうすればOutOfMemoryを避けることができますか?

ありがとうございます。

+2

一般的に、範囲はマテリアライズする必要はありません。 REPL上で ''toto(Int.MaxValue)'を試して、結果の型を見てください。そのようなタイプについては、[Scalaのソースを見る](http://www.scala-lang.org/api/current/scala/collection/immutable/Range$$Inclusive.html)を自由に感じてください:) –

+2

あなたは話しています'Range'については、あなたの関数は' List'を返します。これは、スカラーの型が異なっています。 'List [Long]'が必要な場合は 'List.range(0L、10)'とすることができます – 4e6

+1

なぜこのような範囲が必要ですか?それを得るのはかなり簡単ですが(パラダイムの答えを参照してください)、それを使用することはしばしば実用的ではありません。あなたの問題に対するより良い解決策があるかもしれません。また、あなたのエラーは何ですか? '1〜10000000'はエラーになりません。 –

答えて

5

おそらく範囲は必要ありません。私はストリームを取ってそれを繰り返します。

def stream(i: Long = 1): Stream[Long] = i #:: stream(i + 1) 

は、ストリームは、あなたがすべてのエラーをGETTません怠惰なコレクションであるため、要素間の差が1であるINFINITストリームを生成します。以上の10000000の要素を反復処理するには、単に次のようにします。StreamIterableあるので

val range = stream take 10000000 
for (i <- range) { 
    ... 
} 

take 10000000サイズ10000000でStreamを返します。あなたがcomprehansionのためにそれを渡すことができます。

7

代わりに標準ライブラリのNumericRange[Long]を使用できます。あなたは、次の構文を使用して、このような範囲を作成することができます

7

val range = 1L to 10000000L 

「L」はlitteralsはlong型ではなくint型ですコンパイラに通知することは必須です。

rangeのインスタンスのほぼすべてListメソッドを使用できます。必要に応じて中間値が生成されるため、メモリを埋めるべきではありません。あなたが本当にListがちょうどrange.toListを呼び出し(およびすべてのリスト要素に対応するために、ヒープサイズを増やす)必要がある場合、範囲は、

しかしなど、Traversable[Long]Seq[Long]Iterable[Long]を期待して任意のメソッドに渡すことができます。..

+2

"1L〜10000000000L"はIllegalArgumentExceptionを生成しますが、 "seqsはInt.MaxValue以上の要素を含むことはできません" – DNA

+0

@DNAはい、実際にはストリームや独自のイテレータを使用できます。標準のlibコレクションにはサイズメソッドがあり、これはIntを返す必要があります。特別なニーズがある場合は、特別なコレクションを使用する必要があります。 – paradigmatic