2

別のシーケンスを繰り返しながら、シーケンスに要素を追加する必要があるコードがいくつかあります。scala でそれを行うための「推奨される」方法、またはより良い方法はどれですか?その理由は?:

方法 1:

val builder = Seq.newBuilder[String]    
for(i <- iterator){
builder += i  //Everytime I want to add a new element    
}

方法 2:

val stringSeq = iterator.foldLeft(Seq[String]()){
case (acc, i) => i +: acc
}
4

3 に答える 3

2

両方を使用して、機能的かつ効率的にしてみませんか?

iterator.foldLeft(Seq.newBuilder[String])(_ += _).result

このコードの動作は、2 番目のソリューションの動作とは少し異なることに注意してください。ソリューションは反復子の順序を逆にしますが、私のソリューションはそれを維持します。どれが望ましいかわかりません。

また、思い浮かばなかった場合に備えて (私が明白である場合は申し訳ありません)、使用していない特定の理由はありますiterator.toSeqか?

于 2014-05-20T10:17:55.703 に答える
1

++:メソッドがSeqあるので、そのままできますseq ++: iterator

パフォーマンスについて心配する必要はありません。これは基本的な API スカラが提供するものであり、信頼する必要があります。

実際、現在の実装は方法 1 に似ています。

于 2014-05-19T09:15:57.640 に答える
1

変更可能な状態を作成しないため、方法 2はより慣用的で、より機能的に感じられると思います。

方法 1forは、オブジェクト指向プログラミングで使用されているものと似ているため、もう少し必須のようです。

ただし、Scala には OOP 要素と FP 要素の両方があります。たとえば、パフォーマンス上の理由から、より適切に機能するコンストラクトを使用する必要があると思います(ただし、ヘッドへの追加はSeq高速である必要があるため、あなたの例はそうではないと思います)。

PS。あなたのジェネレーターはそうであっては<-ならず<、それはfoldLeft(大文字のL)です

于 2014-05-19T08:39:14.420 に答える