[解決済み] Scalaのリストを作成するための好ましい方法
質問
Scalaでイミュータブルリストを構築する方法はいくつかあります(以下の工夫されたサンプルコードを参照)。ミュータブルなListBufferを使う方法と、リスト内で
var
リストを作成し、それを変更する。
末尾再帰的
メソッドを使うなど、おそらく私が知らない他の方法があります。
本能的にListBufferを使用していますが、そうする正当な理由はありません。リストを作成するための好ましい方法または慣用的な方法はありますか、あるいは、別の方法よりもある方法に最適な状況がありますか。
import scala.collection.mutable.ListBuffer
// THESE are all the same as: 0 to 3 toList.
def listTestA() ={
var list:List[Int] = Nil
for(i <- 0 to 3)
list = list ::: List(i)
list
}
def listTestB() ={
val list = new ListBuffer[Int]()
for (i <- 0 to 3)
list += i
list.toList
}
def listTestC() ={
def _add(l:List[Int], i:Int):List[Int] = i match {
case 3 => l ::: List(3)
case _ => _add(l ::: List(i), i +1)
}
_add(Nil, 0)
}
どのように解決するのですか?
ListBuffer
はミュータブルリストであり、一定時間ごとに追加を行い、一定時間ごとに
List
.
List
は不変であり、一定時間のプリペンドと線形時間のアペンドを持ちます。
リストをどのように構築するかは、リストを使用するアルゴリズムと、リストを作成するために要素を取得する順序に依存します。
例えば、要素を取得する順番が使用するときと逆であれば、単に
List
と言ってプリペンドを行う。末尾再帰関数でそうするかどうか。
foldLeft
などで行うかどうかは、あまり関係ありません。
要素を使う順番と同じように取得するのであれば
ListBuffer
は、パフォーマンスが重要である場合、最も望ましい選択です。
しかし、クリティカルパスでなく、入力が十分に少ない場合は、常に
reverse
を使用するか、あるいは単に
foldRight
または
reverse
という入力があり、これは線形時間です。
あなたが
DON'T
を使用することです。
List
を使い、それに追加することです。これは、単に前置して最後に反転させるよりもはるかに悪いパフォーマンスを与えるでしょう。
関連
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み] 述語で配列を2つに分割するには?
-
[解決済み] RDDの内容を印刷するには?
-
[解決済み] IntelliJ IDEAで依存関係が変更された後、build.sbtから強制的に再ロードするには?
-
[解決済み] Scalaでは、'val a. = _' (アンダースコア)は具体的にどのような意味ですか?A = _' (アンダースコア)とはどういう意味ですか?
-
[解決済み] Scalaのforループは下降か減少か?
-
[解決済み] scalaの列挙を理解する
-
[解決済み] SBTが終了せずに実行を停止する
-
[解決済み] Scalaです。リスト[Future]からFuture[List]への変換は、失敗したFutureを無視する。
-
[解決済み] private[this] vs private
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] RDDの内容を印刷するには?
-
[解決済み] 依存するメソッドタイプの説得力のある使用例とは?
-
[解決済み] IntelliJ IDEAで依存関係が変更された後、build.sbtから強制的に再ロードするには?
-
[解決済み] ネストした構造体をよりきれいに更新する方法
-
[解決済み] Scalaのforループは下降か減少か?
-
[解決済み] scalaの列挙を理解する
-
[解決済み] SBTが終了せずに実行を停止する
-
[解決済み] Scalaのパターンマッチはなぜ変数で機能しないのですか?
-
[解決済み] Scalaです。リスト[Future]からFuture[List]への変換は、失敗したFutureを無視する。
-
[解決済み] private[this] vs private