【Java】変更可能文字列の操作（AOJ15 - 文字列変換）

#変更可能文字列の操作を行う
* **StringBuilderクラスのメソッド**
* サンプルコードです
    * 追加・挿入・置換・削除・反転

```java
public class Main {
	public static void main(String[] args) {

    StringBuilder sb1 = new StringBuilder("MohuMohuNekoSan");
    StringBuilder sb2 = new StringBuilder("MohuiNekoSanMohui");
    StringBuilder sb3 = new StringBuilder("あめんぼ赤いな");

    //末尾に"***"を追加
    System.out.println(sb1.append("^･ｪ･^"));//MohuMohuNekoSan^･ｪ･^
    
    //インデックス番号1（２文字目）に"***"を挿入
    System.out.println(sb1.insert(1, "ooo")); //MoooohuMohuNekoSan^･ｪ･^
    
    //インデックス番号15～18を Sama に置換する
    System.out.println(sb1.replace(15, 18, "Sama")); //MoooohuMohuNekoSama^･ｪ･^
    
    //インデックス番号3を'-'に置換
    //setCharAtは戻り値voidなのでそのままplintlnしないよう注意！
    sb1.setCharAt(3, '-');
    System.out.println(sb1);                  //Moo-ohuMohuNekoSama^･ｪ･^
    //System.out.println(sb1.setCharAt(3, '*')); //Main.java:30: error: void cannot be dereferenced　
    
    //インデックス番号0～7を削除
    System.out.println(sb1.delete(0,7));     //MohuNekoSama^･ｪ･^
    
    //インデックス番号3を削除する
    System.out.println(sb1.deleteCharAt(3)); //MohNekoSama^･ｪ･^
    
    //インデックス番号3を取得
    System.out.println(sb1.charAt(3));       //N
    
    //"CD"が一番最初に出現するインデックス番号を取得する
    System.out.println(sb2.indexOf("Mohui"));//0

    System.out.println(sb2.indexOf("hoge")); // -1
    
    //インデックス番号5以降で"Mohui"が最初に出現するインデックス
    System.out.println(sb2.indexOf("Mohui", 5));     //12
    
    //"Mohui"が一番最後に出現するインデックス番号を取得する
    System.out.println(sb2.lastIndexOf("Mohui"));    //12
    
    //インデックス番号10（１１文字目）以前で"CD"が最後に出現するインデックス番号を取得する
    System.out.println(sb2.lastIndexOf("Mohui", 5)); //0
    
    //文字数を取得する
    System.out.println(sb3.length());//  7
    
    //文字列を反転
    System.out.println(sb3.reverse()); //ない赤ぼんめあ
    
    //インデックス番号3以降の文字列を取得
    System.out.println(sb3.substring(3)); //ぼんめあ
    
    //インデックス番号0～3の文字列を取得
    System.out.println(sb3.substring(0, 3)); //ない赤
    
    //StringBuilderをString型に変換
    System.out.println(sb3.toString()); //ない赤ぼんめあ
	}
}
```


#文字列変換（ITP1-9）
>
文字列 str に対して、与えられた命令の列を実行するプログラムを作成してください。命令は以下の操作のいずれかです：
* print a b: str の a 文字目から b 文字目までを出力する。
* reverse a b: str の a 文字目から b 文字目までを逆順にする。
* replace a b p: str の a 文字目から b 文字目までを p に置き換える。
ここでは、文字列 str の最初の文字を 0 文字目とします。
-- Input
1 行目に文字列 str が与えられます。str は英小文字のみ含みます。2 行目に命令の数 q が与えられます。続く q 行に各命令が上記の形式で与えられます。
-- Output
各 print 命令ごとに文字列を１行に出力してください。
-- Constraints
* 1≤strの長さ≤1000
* 1≤q≤100
* 0≤a≤b<strの長さ0≤a≤b<strの長さ
* replace 命令では 長さb−a+1=pの長さ
-- Sample Input 1
abcde
3
replace 1 3 xyz //axyze
reverse 0 2       //yxaze
print 1 4             //xaze
-- Sample Output 1
xaze



```java
import java.util.*;

class Main {
    public static void main(String args[]) {
        try (Scanner sc = new Scanner(System.in)) {
            StringBuilder S = new StringBuilder(sc.next());
            int N = sc.nextInt();
            for (int i = 0; i < N; i++) {
                String operator = sc.next();
                        int a = sc.nextInt(), b = sc.nextInt() + 1;
                if (operator.equals("print")) {
                        System.out.println(S.substring(a, b));
                } else if(operator.equals("reverse")) {
                        S.replace(a, b, (new StringBuilder(S.substring(a, b))).reverse().toString());
                } else {
                        String x = sc.next();
                        S.replace(a, b, x);
                }
            }
        }
    }
}
```