たとえば、文字列val s = "Test"
があります。 t, e, s, t
にどのように分割しますか?
次のようにtoList
を使用できます。
scala> s.toList
res1: List[Char] = List(T, e, s, t)
配列が必要な場合は、toArray
を使用できます
scala> s.toArray
res2: Array[Char] = Array(T, e, s, t)
キャラクターが必要ですか?
"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")
さらに、実際に必要なのが実際のリストオブジェクトではなく、単に各文字の処理を行う場合、文字列はScalaで反復可能な文字のコレクションとして使用できることに注意してください
for(ch<-"Test") println("_" + ch + "_") //prints each letter on a different line, surrounded by underscores
実際、特別なことをする必要はありません。 Predef
からWrappedString
への暗黙的な変換とWrappedString
がIndexedSeq[Char]
を既に暗黙的に変換しているので、次のように利用できるすべての利点があります。
"Test" foreach println
"Test" map (_ + "!")
Predef
には、augmentString
のwrapString
よりも優先度の高いLowPriorityImplicits
変換があります。したがって、文字列はStringLike[String]
になります。これは、文字のSeq
でもあります。
別の簡単な方法は-
"Test".map(lines=>lines+"")
res34: scala.collection.immutable.IndexedSeq[String] = Vector(T, e, s, t)