60

For example, there is a string val s = "Test". How do you separate it into t, e, s, t?

1
  • 2
    What output is needed? You can just convert it to list S.toList Output List[Char] = List(T, e, s, t) Commented Feb 19, 2011 at 16:44

4 Answers 4

71

Do you need characters?

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

Do you need bytes?

"Test".getBytes  // Java provides this

Do you need strings?

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

Do you need UTF-32 code points? Okay, that's a tougher one.

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")
Sign up to request clarification or add additional context in comments.

1 Comment

For even being aware of code points, you deserve to have the accepted answer here. Though I doubt the OP will appreciate the subtlety.
61

You can use toList as follows:

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

If you want an array, you can use toArray

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

3 Comments

For those seeing this, toCharArray should always be preferred when possible. toList is painfully slow. Each character primitive becomes a Character object. Each link in the list is an object as well. 2 bytes becomes 12+2+12+2=28 bytes. We can no longer have quick and random access. However, if you are just playing around or writing Hello World, then have at it, but don't expect it to scale well.
I am new to Scala. Why does "abc".toList work but "abc".toList() doesn't work. Where can I find documentation for scala String.
Found the answer here, stackoverflow.com/questions/6643030/…, never mind.
6

Actually you don't need to do anything special. There is already implicit conversion in Predef to WrappedString and WrappedString extends IndexedSeq[Char] so you have all goodies that available in it, like:

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

Edit

Predef has augmentString conversion that has higher priority than wrapString in LowPriorityImplicits. So String end up being StringLike[String], that is also Seq of chars.

2 Comments

I think it goes via StringOps actually.
@Kevin Wright: You are right. Predef has augmentString conversion that has higher priority than wrapString in LowPriorityImplicits. Sorry for this, I don't noticed it. Thanks!
5

Additionally, it should be noted that if what you actually want isn't an actual list object, but simply to do something which each character, then Strings can be used as iterable collections of characters in Scala

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.