Например, существует строка val s = "Test"
. Как вы разделите его на t, e, s, t
?
Как разбить строки на символы в Scala
Ответ 1
Вы можете использовать toList
следующим образом:
scala> s.toList
res1: List[Char] = List(T, e, s, t)
Если вам нужен массив, вы можете использовать toArray
scala> s.toArray
res2: Array[Char] = Array(T, e, s, t)
Ответ 2
Вам нужны персонажи?
"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")
Ответ 3
Кроме того, следует отметить, что если то, что вы действительно хотите, не является фактическим объектом списка, а просто для того, чтобы делать что-либо, что каждый символ, то строки могут использоваться как итеративные коллекции символов в Scala
for(ch<-"Test") println("_" + ch + "_") //prints each letter on a different line, surrounded by underscores
Ответ 4
На самом деле вам не нужно ничего особенного делать. Существует уже неявное преобразование в Predef
to WrappedString
и WrappedString
extends IndexedSeq[Char]
, поэтому у вас есть все полезные свойства, доступные в нем, например:
"Test" foreach println
"Test" map (_ + "!")
Изменить
Predef
имеет преобразование augmentString
, которое имеет более высокий приоритет, чем wrapString
в LowPriorityImplicits
. Итак, String заканчивается StringLike[String]
, то есть также Seq
символов.