如何在Scala中将字符串拆分为字符

sam*_*sam 49 string split scala character character-encoding

例如,有一个字符串val s = "Test".你怎么把它分成t, e, s, t

Rex*_*err 61

你需要角色吗?

"Test".toList    // Makes a list of characters
"Test".toArray   // Makes an array of characters
Run Code Online (Sandbox Code Playgroud)

你需要字节吗?

"Test".getBytes  // Java provides this
Run Code Online (Sandbox Code Playgroud)

你需要字符串吗?

"Test".map(_.toString)    // Vector of strings
"Test".sliding(1).toList  // List of strings
"Test".sliding(1).toArray // Array of strings
Run Code Online (Sandbox Code Playgroud)

你需要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")
Run Code Online (Sandbox Code Playgroud)

  • 即使知道代码点,你也应该在这里得到公认的答案。虽然我怀疑 OP 会欣赏这种微妙之处。 (3认同)

aio*_*obe 53

您可以使用toList如下:

scala> s.toList         
res1: List[Char] = List(T, e, s, t)
Run Code Online (Sandbox Code Playgroud)

如果你想要一个数组,你可以使用 toArray

scala> s.toArray
res2: Array[Char] = Array(T, e, s, t)
Run Code Online (Sandbox Code Playgroud)

  • 对于那些看到这一点的人来说,在可能的情况下,应始终首选toCharArray.toList非常缓慢.每个字符基元都成为一个Character对象.列表中的每个链接也是一个对象.2个字节变为12 + 2 + 12 + 2 = 28个字节.我们无法再快速随机访问.但是,如果您只是在玩游戏或编写Hello World,那么请注意,但不要指望它能够很好地扩展. (5认同)
  • 在这里找到答案,http://stackoverflow.com/questions/6643030/what-is-the-rule-for-parenthesis-in-scala-method-invocation,没关系. (2认同)

ten*_*shi 6

实际上你不需要做任何特别的事情.已经隐式转换PredefWrappedStringWrappedString扩展,IndexedSeq[Char]因此您可以使用其中的所有好东西,例如:

"Test" foreach println
"Test" map (_ + "!") 
Run Code Online (Sandbox Code Playgroud)

编辑

Predef具有augmentStringwrapString在中具有更高优先级的转换LowPriorityImplicits.所以字符串最终存在StringLike[String],也Seq就是字符.


Dav*_*ith 5

另外,应该注意的是,如果你真正想要的不是一个真正的列表对象,而只是为每个字符做一些事情,那么Strings可以用作Scala中可迭代的字符集合

for(ch<-"Test") println("_" + ch + "_") //prints each letter on a different line, surrounded by underscores
Run Code Online (Sandbox Code Playgroud)