7

私はScala言語が初めてです。

ロングタイプの射程が欲しい。

ステップ 1 で [1, 2, 3 ... 10000000] のリストが必要です。int の代わりに Long を使用しているため、until/to を使用するとエラーが発生します。

開始、終了、および空のリストを期待し、[開始..終了]のリストを生成する単純な関数を作成しようとしました。

これが私の機能です:

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)
    }
}

次のように呼び出すと、次の行でエラーrange_l(1L, 1000000L, List())が発生します。OutOfMemoryadd_to_list = start :: list

あなたは私に何をアドバイスできますか?関数を取得するにはどうすればよいですRange[Long]か、または関数を最適化するにはどうすればよいですか。OutOfMemory を回避するにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

15

このような範囲は、次の構文を使用して作成できます。

val range = 1L to 10000000L

「L」は、リテラルが int ではなく long であることをコンパイラーに通知するために必須です。

その後、インスタンスでほぼすべてのListメソッドを使用できますrange。必要に応じて中間値が生成されるため、メモリがいっぱいになることはありません。Traversable[Long]範囲は、 a 、 a Seq[Long]、 anIterable[Long]などを期待する任意のメソッドに渡すことができます。

Listただし、本当に呼び出しだけが必要な場合range.toList(およびすべてのリスト要素に対応するためにヒープ サイズを大きくする場合)...

于 2012-05-09T10:59:21.633 に答える
9

代わりに、標準ライブラリの NumericRange[Long]を使用できます。

于 2012-05-09T07:24:34.133 に答える
8

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

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

要素間の差が1である無限のStreamを生成します。Streamは遅延コレクションであるため、エラーは発生しません。10000000を超える要素を繰り返すには、次を使用するだけです。

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

take 10000000Streamサイズが10000000のaを返します。であるため、理解のためにに渡すことができますStreamIterable

于 2012-05-09T07:15:13.130 に答える