2016-06-23 15 views
2

私はScalaを初めて使いました。Scala:リストの一部を別のリストにコピーする方法

私はリストを持っています origList = List何千もの要素を持つ[Double]です。私は別のリスト OUTLIST =リスト[ダブル] を作成し、それにorigListから要素をコピー指標 スタートで、1 +開始、...、出力リストである+ nコピー-1 を起動する必要があり は、nコピーを持っています要素。

このコードの部分は何度も実行されます。 Scalaでこれを行う最も効率的な方法は何ですか?

+1

あなたは 'スライス'を探しています。 'List'も最良のデータ構造ではないかもしれません。 –

答えて

3

人々が通常スカラーで行う方法はlist.slice(start, start+nCopy)です。 ScalaではListないArrayListのようなランダムアクセスコンテナがJavaであることを

注意、。これはリンクされたリストとして実装されています。特に、これを何度もやってみようとすると、あなたのリストを手近に索引付けされたもの、つまりval converted = list.toIndexedSeqまたはそれ以上のものに変換すると、かなり助けになります。val converted = list.toArray

.sliceArrayまたはIndexedSeqは、特にstartが高い場合にはるかに効率的です。

あなたが本当にある場合さて、この一回の操作の効率化、何も(残念ながら)懸念が良い古いJavaのアプローチを打つ:

val converted = list.toArray 
val copied = java.util.Arrays.copyOfRange(converted, start, start+nCopy) 

これは、より速く大きさの注文することができ(数百の)十分な数の要素をコピーするときは、converted.slice(単独ではlist.sliceのまま)

+0

'java.util.Arrays.copyOfRange'が' converted#slice'よりも "orders orders of magnitude faster"になる理由を教えてください。最後に、 'Array#copyOfRange'のドキュメント(https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#copyOfRange(T[],%20int,%20int) ))、あるリスクは、「元の配列から指定された範囲を含む新しい配列。必要な長さを得るために切り捨てられたかヌルで埋められた」 –

+0

これはネイティブコードを使用して(非常に) scalaの実装のように要素を1つずつ動かすのではなく、一度に連続したメモリをコピーしてください。なぜ「なぜ」という言葉が「なぜそれがjavaと同じ方法で実装されていないのか」という意味であれば、私は分かりません。あなたはスカラーの実装を書いた人に誰かに尋ねなければなりません。私の推測はそれがより簡単だったということです。 「リスク」の部分については、その意味がわかりません。 – Dima

+0

@Dimaの説明をありがとう。 "リスク"とは、java.util.Arrays.copyOfRange(Array(1,2,3)、0、5) '===' Array(1,2,3、0、0) 'を意味していました。私の素朴な仮定は、上記は 'Array(1,2,3)'と等しくなり、 '' null''は埋められないということでした。私は、 "ドキュメントを読む"は、メソッドを使うときの仮定された仕事だと思いますが、パディングされた 'null'が期待していません。 –

関連する問題