Insert character in Scala String

14,141

Solution 1

Rope data structure proves a valid alternative to String and StringBuffer for heavy manipulation in (very) large strings, especially in regard to insertions and deletions.

Scalaz includes class Rope[A] (see API and Rope.scala) and class WrappedRope[A] (see API) with a plethora of operations on rope strings.

Implementations in Java include http://ahmadsoft.org/ropes/. A benchmarking study for this Java implementation may be found at http://www.ibm.com/developerworks/library/j-ropes/ .

A publication on ropes as an alternative to strings may be found at http://citeseer.ist.psu.edu/viewdoc/download?doi=10.1.1.14.9450&rep=rep1&type=pdf

Solution 2

We can use the patch method on Strings in order to insert a String at a specific index:

"abde".patch(2, "c", 0)
// "abcde"

This:

  • drops 0 (third parameter) elements at index 2

  • inserts "c" at index 2

which in other words means patching 0 elements at index 2 with the string "c".

Solution 3

Try this

val (fst, snd) = s.splitAt(2)
fst + 'c' + snd
Share:
14,141
elm
Author by

elm

Updated on June 04, 2022

Comments

  • elm
    elm about 2 years

    For any given String, for instance

    val s = "abde"
    

    how to insert a character c: Char at position 2, after b ?

    Update

    Which Scala collection to consider for multiple efficient insertions and deletions at random positions ? (Assuming that a String may be transformed into that collection.)

    • Kvass
      Kvass almost 10 years
      Get the substrings [0,2) and [2,length), and then do sub1 + c + sub2
    • Kvass
      Kvass almost 10 years
      String sub1 = s.substring(0,2) gives you "ab"
    • yǝsʞǝla
      yǝsʞǝla almost 10 years
      Don't forget that strings are immutable
    • om-nom-nom
      om-nom-nom almost 10 years
      @enzyme generally speaking, if you're doing it a lot and you have long strings, rope is the right data structure. IIRC, Scala has no such thing in standard library, though.
    • elm
      elm almost 10 years
      @om-nom-nom thanks! looks like the way to go... looking for Scala rope implementations...
  • tiran
    tiran almost 10 years
    not sure whether Vectors suit for your requirement. check performance characteristics in here