2011-07-13 12 views
2

を使用して要素を付加するより良い方法は、私は、このスニペットのように、行のコレクションを持っている:私はwhichLineに等しいのですすべての行の前に何かを付加しようとしています代替/ Scalaの

def insertBeforeLine(text:String,whichLine:String,what:String) = { 
    val lines = text.lines 
    lines.foldLeft(ListBuffer[String]())((acumulator,element) => { 
     acumulator ++ { if(element == whichLine) Array(what,element) else Array(element) } 
    }).mkString("\n") 
    } 

。より良い/よりクリーンな方法がありますか?例えば、私の入力がある場合:

line1 
line2 
line4 

と私はそれが生成されますinsertBeforeLine(input,"line4","line3")ように私の関数を呼び出す:

line1 
line2 
line3 
line4 

答えて

5

あなたが本当に行の文字列を持っている(そして、あなたは、エンドオブを含めることができる場合改行文字、そして、それは一貫性のある)、あなたはjava.lang.Stringから置き換える使用することができます。

text.replace(which,what+which) 

をしかし、あなたは、より一般的な何かをしたい場合は、

のようなもの
lines.flatMap(l => if (l==which) Seq(what,l) else Seq(l)) 

は、それを表現するためのコンパクトで明確な方法です(少なくともflatMapの仕組みを知っている人には)。

もしあなたが何かを最大限に効率的にしたいのであれば、多くのwhileループとおそらくいくつかのバイト配列中間体では長い醜い答えです。