web-dev-qa-db-fra.com

Comment diviser des chaînes en caractères dans Scala

Par exemple, il existe une chaîne val s = "Test". Comment séparez-vous le t, e, s, t?

45
sam

Vous pouvez utiliser toList comme suit:

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

Si vous voulez un tableau, vous pouvez utiliser toArray

scala> s.toArray
res2: Array[Char] = Array(T, e, s, t)
51
aioobe

Avez-vous besoin de personnages?

"Test".toList    // Makes a list of characters
"Test".toArray   // Makes an array of characters

Avez-vous besoin d'octets?

"Test".getBytes  // Java provides this

Avez-vous besoin de cordes?

"Test".map(_.toString)    // Vector of strings
"Test".sliding(1).toList  // List of strings
"Test".sliding(1).toArray // Array of strings

Avez-vous besoin de points de code UTF-32? Ok, c'est un plus difficile.

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")
59
Rex Kerr

En outre, il convient de noter que si ce que vous voulez réellement n'est pas un objet de liste, mais simplement de faire quelque chose pour chaque caractère, alors les chaînes de caractères peuvent être utilisées comme des ensembles de caractères itérables dans Scala

for(ch<-"Test") println("_" + ch + "_") //prints each letter on a different line, surrounded by underscores
5
Dave Griffith

En fait, vous n'avez rien de spécial à faire. Il y a déjà une conversion implicite dans Predef à WrappedString et WrappedString étend IndexedSeq[Char] afin que vous ayez tous les goodies disponibles, comme

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

Modifier

Predef a augmentString conversion qui a une priorité supérieure à wrapString dans LowPriorityImplicits. Donc, String finit par être StringLike[String], c'est aussi Seq de caractères. 

5
tenshi

Un autre moyen simple peut être - 

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