web-dev-qa-db-ja.com

Scalaで文字列を文字に分割する方法

たとえば、文字列val s = "Test"があります。 t, e, s, tにどのように分割しますか?

47
sam

次のようにtoListを使用できます。

scala> s.toList         
res1: List[Char] = List(T, e, s, t)

配列が必要な場合は、toArrayを使用できます

scala> s.toArray
res2: Array[Char] = Array(T, e, s, t)
53
aioobe

キャラクターが必要ですか?

"Test".toList    // Makes a list of characters
"Test".toArray   // Makes an array of characters

バイトが必要ですか?

"Test".getBytes  // Java provides this

文字列が必要ですか?

"Test".map(_.toString)    // Vector of strings
"Test".sliding(1).toList  // List of strings
"Test".sliding(1).toArray // Array of strings

UTF-32コードポイントが必要ですか?さて、それはもっと難しいものです。

def UTF32point(s: String, idx: Int = 0, found: List[Int] = Nil): List[Int] = {
  if (idx >= s.length) found.reverse
  else {
    val point = s.codePointAt(idx)
    UTF32point(s, idx + Java.lang.Character.charCount(point), point :: found)
  }
}
UTF32point("Test")
60
Rex Kerr

さらに、実際に必要なのが実際のリストオブジェクトではなく、単に各文字の処理を行う場合、文字列はScalaで反復可能な文字のコレクションとして使用できることに注意してください

for(ch<-"Test") println("_" + ch + "_") //prints each letter on a different line, surrounded by underscores
5
Dave Griffith

実際、特別なことをする必要はありません。 PredefからWrappedStringへの暗黙的な変換とWrappedStringIndexedSeq[Char]を既に暗黙的に変換しているので、次のように利用できるすべての利点があります。

"Test" foreach println
"Test" map (_ + "!") 

編集

Predefには、augmentStringwrapStringよりも優先度の高いLowPriorityImplicits変換があります。したがって、文字列はStringLike[String]になります。これは、文字のSeqでもあります。

5
tenshi

別の簡単な方法は-

    "Test".map(lines=>lines+"")
     res34: scala.collection.immutable.IndexedSeq[String] = Vector(T, e, s, t)
0
Ankita