Groovyで文字列の途中に破壊的に文字列を挿入する

Groovyで文字列の一部を破壊的に削除する
同様、できない。
だって、Groovy/Javaでは、Rubyのsub!()のように直接文字列オブジェクトを変更はできないもん。(だよね?)
できるそうだ。



str1 = "xxxあxxxx"

str2 = str1.replaceFirst(/あ/) { s -> s + "いうえお" }
println str1
println str2

str1 = str1.replaceFirst(/あ/) { s -> s + "いうえお" }
println str1

str3 = "あいうえお"
str4 = str3.replaceFirst(/(?m)\A.{3}/){ s -> s + "inserted" }
println str3
println str4

str3 = str3.replaceFirst(/(?m)\A.{3}/){ s -> s + "inserted" }
println str3

str4 = "あいうえお"
str5 = sprintf("%s%s%s", str4[0..3], "inserted", str4[4..-1])

println str4
println str5

str4 = sprintf("%s%s%s", str4[0..3], "inserted", str4[4..-1])
println str4

補足

chars[3,0] = ["inserted"]

Rubyだと["inserted"]でchar配列になるのか。
なので、こんな風に挿入することもできるのね



chars = ["inserted"]
println chars
println chars.size()
println chars.class
[inserted]
1
class java.util.ArrayList

GroovyだとArrayListにinsertedが1つの文字列として入る。
なので無理だ。

chars = "あいうえお".split()
chars[3.."inserted".size()] = "inserted".split()
println chars.join("")
Caught: groovy.lang.MissingMethodException: No signature of method: [Ljava.lang.String;.putAt() is applicable for argument types: (groovy.lang.IntRange, [Ljava.lang.String;) values: [3..8, [inserted]]
Possible solutions: putAt(java.lang.String, java.lang.Object), putAt(java.lang.Integer, java.lang.Object), getAt(groovy.lang.IntRange), getAt(java.lang.Integer), getAt(java.lang.String), getAt(groovy.lang.EmptyRange)
        at Q062_文字列の途中に文字列を挿入する.run(Q062_文字列の途中に文字列を挿入する.groovy:19)

だめだな。
うーん・・・
sprintfでやったけど、もっとサクツとできる方法があるんだろうか。






添削

String.metaClass.insert << { i, s ->
    def chars = delegate.value as List;
    chars.addAll(i, s as List);
    delegate.value = chars as char[];
    delegate.count = chars.size()
}

def s = 'groovy'
s.insert(3, 'groovy')
s

参りましたm(__)m


id:nobusue

破壊的代入ではありませんが、1.8で途中に文字列を挿入するGDK APIが追加されています。
http://groovy.codehaus.org/groovy-jdk/java/util/List.html#plus%28int,%20T[]%29

添削歓迎

ここ間違ってるよ
こうした方がGroovyらしくないか?
などなど
方法は、コメント、トラックバックはてブTwitter @orange_clover宛 で、お願いしまます。






実行環境

プログラミングGroovy』に向けて、環境を1.8.0にした
過去の記事と比較するために、できるだけ同じ組み合わせ(Groovy:1.6.5,JVM:1.6.0_12)でやってたけど
最新で動かなきゃ意味ないからね。








Groovyの詳細についてはJavadocと以下の書籍を参考にしている。




Dierk Konig、Andrew Glover、Paul King、、Guillaume Laforge、Jon Skeet、杉浦 孝、櫻井 正樹、須江 信洋、関谷 和愛、佐野 徹郎、寺沢 尚史

Amazonでご確認ください。



問題自体は第2版のもの。rubyと似てる部分も多いので、ヒントにもなる。
写経でもいいが自分で考えるために他言語の例をGroovyで置き換えてる。




青木 峰郎、後藤 裕蔵、高橋 征義、まつもと ゆきひろ

価格: ¥ 2,940
価格は記載時点のものです。購入前にAmazonでご確認ください。




Groovyイン・アクションを読むならあった方が便利かな。

Rubyレシピブックは「ほんたった」で立ててる