Как разбить строки на символы в Scala - PullRequest
47 голосов
/ 19 февраля 2011

Например, есть строка val s = "Test".Как разделить его на t, e, s, t?

Ответы [ 5 ]

60 голосов
/ 20 февраля 2011

Вам нужны символы?

"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")
52 голосов
/ 19 февраля 2011

Вы можете использовать toList следующим образом:

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

Если вы хотите массив, вы можете использовать toArray

scala> s.toArray
res2: Array[Char] = Array(T, e, s, t)
5 голосов
/ 19 февраля 2011

На самом деле вам не нужно делать ничего особенного. Уже есть неявное преобразование в Predef в WrappedString, а WrappedString расширяет IndexedSeq[Char], так что у вас есть все доступные вкусности, такие как:

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

Редактировать

Predef имеет augmentString преобразование, которое имеет более высокий приоритет, чем wrapString в LowPriorityImplicits. Таким образом, строка в конечном итоге становится StringLike[String], то есть также Seq символов.

5 голосов
/ 19 февраля 2011

Кроме того, следует отметить, что если то, что вы на самом деле хотите, это не фактический объект списка, а просто сделать что-то, что каждый символ, то строки могут быть использованы в качестве повторяемых наборов символов в Scala

for(ch<-"Test") println("_" + ch + "_") //prints each letter on a different line, surrounded by underscores
0 голосов
/ 17 января 2018

Другим простым способом может быть -

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