2016-10-31 4 views
0
val list = List("a", "b", "c") 

リストの各要素をindexで移動したいのですが。 これには2通りの方法があります。Scalaの.zipWithIndexとカスタムインデックスの値の差

私はそれらの間の違いは何ですか?インターネット

list.zipWithIndex.foreach { case(str, idx) => ... } 

から

var idx = 0 
list.foreahch { str => ... idx++ } 

別の方法を作った最初の方法

答えて

1

機能的な方法ではありません。上記のコードで

var index = 0 

list.foreach { elem => 
//do something with elem 
index += 1 
} 

ものを、次の悪い習慣

1)変更可能な変数です。 (誤って、一部の人が突然変異を起こし、並行してうまくいかない)。

2)エラーが発生しやすい。増分は(あなたが災害thatsのインクリメントを忘れた場合)

list.zipWithIndex.foreach { case (elem, index) => 
    //do something. 
} 

インデックスは魔法のユーザーに付与され

機能的な方法で行われる必要があります。あなたは国家の違法なアクセスを心配する必要はなく、インデックスを増やすことは愚かな証拠です。

2

zipWithIndex 2タプルのコレクションを作成します。独自のものを作成することで、出力に使用するデータ構造のタイプを少し柔軟にすることができます。

しかし、それは何のための標準ライブラリと呼ばれていません。確立された標準を維持することには、多くの利点があります。

0

zipstreamを使用して独自のインデックスを定義することもできます。

List("a", "b", "c") zip (Stream from 1) 

なお、上記のコードは、対に対応する要素を組み合わせることによって、このリストとコレクション[STREAM]から形成されたリストを返す

List((a,1), (b,2), (c,3)) 

を返します。

0

ご存知のはずの小さな違いがあります。zipWithIndexがコレクションを通して余分な繰り返しを引き起こすのは事実です。

これはviewを使用して解決できます。だから、

、代わりに:

あなたがすべき
list.zipWithIndex.foreach { case(str, idx) => ... } 

list.view.zipWithIndex.foreach { case(str, idx) => ... } 
関連する問題