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
破壊的代入ではありませんが、1.8で途中に文字列を挿入するGDK APIが追加されています。
http://groovy.codehaus.org/groovy-jdk/java/util/List.html#plus%28int,%20T[]%29
添削歓迎
ここ間違ってるよ
こうした方がGroovyらしくないか?
などなど
方法は、コメント、トラックバック、はてブ、Twitter @orange_clover宛 で、お願いしまます。
実行環境
- OS:Windows XP
- Groovy Version: 1.8.0
- JVM: 1.6.0_26
『プログラミング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で置き換えてる。
Groovyイン・アクションを読むならあった方が便利かな。