Zum Beispiel gibt es einen String-Wert s = "Test"
. Wie trennst du es in t, e, s, t
?
Sie können toList
wie folgt verwenden:
scala> s.toList
res1: List[Char] = List(T, e, s, t)
Wenn Sie ein Array wünschen, können Sie toArray
verwenden.
scala> s.toArray
res2: Array[Char] = Array(T, e, s, t)
Benötigen Sie Charaktere?
"Test".toList // Makes a list of characters
"Test".toArray // Makes an array of characters
Benötigen Sie Bytes?
"Test".getBytes // Java provides this
Benötigen Sie Saiten?
"Test".map(_.toString) // Vector of strings
"Test".sliding(1).toList // List of strings
"Test".sliding(1).toArray // Array of strings
Benötigen Sie UTF-32-Codepunkte? Okay, das ist schwieriger.
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")
Darüber hinaus sollte beachtet werden, dass Strings in Scala als wiederholbare Sammlungen von Zeichen verwendet werden können, wenn das, was Sie wirklich wollen, kein eigentliches Listenobjekt ist, sondern lediglich etwas mit jedem Zeichen tun soll
for(ch<-"Test") println("_" + ch + "_") //prints each letter on a different line, surrounded by underscores
Eigentlich müssen Sie nichts Besonderes tun. Es gibt bereits eine implizite Konvertierung in Predef
in WrappedString
und WrappedString
erweitert IndexedSeq[Char]
, so dass Sie alle verfügbaren Goodies haben, wie:
"Test" foreach println
"Test" map (_ + "!")
Predef
hat augmentString
-Konvertierung, die eine höhere Priorität hat als wrapString
in LowPriorityImplicits
. String ist also StringLike[String]
, also Seq
von Zeichen.
Ein anderer einfacher Weg kann sein -
"Test".map(lines=>lines+"")
res34: scala.collection.immutable.IndexedSeq[String] = Vector(T, e, s, t)