0

文字列の配列を連結する必要がある場合は、mkString メソッドを使用できます。

val concatenatedString = listOfString.mkString

ただし、文字列のリストが非常に長い場合、連結された文字列を取得することは適切な選択ではない場合があります。この場合、出力ストリームに直接出力する方が適切です。出力ストリームに書き込むのは簡単です。

listOfString.foreach(outstream.write _)

ただし、セパレータを追加する適切な方法はわかりません。私が試したことの1つは、インデックスでループすることです:

var i = 0
for(str <- listOfString) {
  if(i != 0) outstream.write ", "
  outstream.write str
  i += 1
}

これは機能しますが、言葉が多すぎます。関数に上記のコードをカプセル化することはできますが、Scala API に既に同じことを行う関数があるかどうかを知りたいです。

ありがとうございました。

4

5 に答える 5

4

これは、もう少しエレガントな方法で必要なことを行う関数です。

def commaSeparated(list: List[String]): Unit = list match {
    case List() => 
    case List(a) => print(a)
    case h::t => print(h + ", ")
                 commaSeparated(t)
}

再帰は可変変数を回避します。

さらに機能的なスタイルにするために、各アイテムで使用する関数を渡すことができます。つまり、次のとおりです。

def commaSeparated(list: List[String], func: String=>Unit): Unit = list match {
    case List() => 
    case List(a) => func(a)
    case h::t => func(h + ", ")
                 commaSeparated(t, func)
}

そして、次のように呼び出します。

commaSeparated(mylist, oustream.write _)
于 2012-12-03T06:21:01.960 に答える
2

並列化されたコードには適していませんが、それ以外の場合は次のようになります。

val it = listOfString.iterator
it.foreach{x => print(x); if (it.hasNext) print(' ')}
于 2012-12-03T15:01:26.337 に答える
2

あなたが望むのは、 のオーバーロードされた定義だと思いますmkString

の定義mkString:

scala> val strList = List("hello", "world", "this", "is", "bob")
strList: List[String] = List(hello, world, this, is, bob)

def mkString: String

scala> strList.mkString
res0: String = helloworldthisisbob

def mkString(sep: String): String

scala> strList.mkString(", ")
res1: String = hello, world, this, is, bob  

def mkString(start: String, sep: String, end: String): String

scala> strList.mkString("START", ", ", "END")
res2: String = STARThello, world, this, is, bobEND

編集 これはどうですか?

scala> strList.view.map(_ + ", ").foreach(print) // or .iterator.map
hello, world, this, is, bob,
于 2012-12-03T05:47:11.940 に答える
1

var を回避する別のアプローチを次に示します。

listOfString.zipWithIndex.foreach{ case (s, i) =>
    if (i != 0) outstream write ","
    outstream write s }
于 2012-12-03T19:48:44.857 に答える