2012-05-12 18 views
2

私はScalaで文字列の配列を持っていると仮定します。適切な方法

val strings = Array[String]("1", "2", "3", "4", "5", "6", "7") 

私は要素がそれぞれ3(任意の数)の連結として得られる新しい配列を作ることです必要なもの("123", "456", "7")

を生じるはずである最初の配列は、スカラ座への新しいことの必然的な要素は、私は簡潔にも効果的でもなかった次のコードを書いた:

var step = 3 
val strings = Array[String]("1", "2", "3", "4", "5", "6", "7") 
val newStrings = collection.mutable.ArrayBuffer.empty[String] 

for (i <- 0 until strings.length by step) { 
    var elem = "" 
    for (k <- 0 until step if i + k < strings.length) { 
    elem += strings(i + k) 
    } 
    newStrings += elem 
} 

これを行うためのScalaの方法は何でしょうか?

答えて

9
strings.grouped(3).map(_.mkString).toArray 

または

​​

私は個人的には最初のバージョン:)

4
strings grouped 3 map (_.mkString) 

か(本当にArrayバックを得るために)

(strings grouped 3 map (_.mkString)).toArray 
+0

あなたのバージョンはドットフリーです:)しかし、あなたは.toArrayステートメントが必要です。あなたのバージョンはArの代わりにIteratorを返しますレイ。 – Rogach

+0

ええ、でも、私は括弧内に完全なステートメントを入れたいとは思わなかった。 :) – Debilski

+3

Fwiw:http://stackoverflow.com/questions/10233227/scala-infix-vs-dot-notation/10313469#10313469 – missingfaktor

3

を好みます..またはslidiを使用してくださいあなたは3を取り、前方3バリアントを移動:

scala> strings.sliding (3, 2) .map (_.mkString).toArray 
res20: Array[String] = Array(123, 345, 567) 

は3を取るが、前方の2

scala> strings.sliding (2, 3) .map (_.mkString).toArray 
res21: Array[String] = Array(12, 45, 7) 

は、それによってスキップ(前方3、2を取るスライディング

val strings = Array[String]("1", "2", "3", "4", "5", "6", "7") 
strings.sliding (3, 3) .map (_.mkString).toArray 

res19: Array[String] = Array(123, 456, 7) 

ngの毎秒)