Javaの文字列操作についてまとめてみた

Javaの文字列操作について学習したのでまとめてみようと思います。
Javaシルバーの勉強をしていて、文字列操作の知識を問う問題で詰まってしまったので備忘録としてまとめてみようと思います。

# indexOf()メソッド

indexOfメソッドは、引数に指定された文字がどこから始まるのかというのを検索するためのメソッドです。
そして、実行すると、1や2のように数値を返します。

## 文法1つ目(indexOf)

```
1.public int indexOf(調べたいワード)
２．public int indexOf(調べたいワード [,int index])
```

indexOfメソッドの書き方は二通りあります。
一番最初の場合は、対象の文字列から調べたいワードが先頭から何番目にあるのかを検索し、その値を返します。

例えば、

```main.java
class Main {
    public static void main(String args[]){
        String str = "あいうえお"; 
        System.out.println(str.indexOf("あ"));
      }      
}
```
以上のコードで`str.indexOf("あ");`とすることで、変数strの中で"あ"が先頭から数えて何番目にあるのかを`System.out.println();`で出力させます。
返ってきた値は

```
0
```

です。なぜかというと、Javaは文字列の場所を指定する時に、0から始めるからです。
一番最初だからといって1から始めるわけではありません。ここは配列の値を呼び出す時と同じです。
でもこれだけでは不便です。
なぜかというと、これは先頭から何番目の文字を検索するだけなので、これだと複数の変数を扱い、それぞれから文字を抜き出す時に
「それぞれの変数の最初から3番目までは共通化されているので、そこは検索対象に入れないで検索をかけたい。」
といった時に非常に不便ですよね。

なので、それを解消するためのものがindexOf()には用意されているので次からそれを紹介します。

## 文法2つ目(indexOf)

今度は、先程行ったことを解消するためのindexOf()の文法を紹介します。

先程は、一番先頭から見て何番目かを見てきました。今度は、先頭から何番目から見てどこにその指定されたワードがあるのかを見る方法を紹介します。

```main.java
class Main {
    public static void main(String args[]){
        String str = "あいうえお"; 
        System.out.println(str.indexOf("あ", 2));
      }      
}
```

上記のサンプルコードで`str.indexOf("あ", 2)`の部分で、第2引数の部分に数字が入っていると思います。
これをすることで、0から始まって2番めの所から(この場合はうの場所)から先に`あ`という文字が入っているのかを検索をかけます。
これをすると戻り値は

```
-1
```

になります。
これはなぜかというと、指定された範囲の中に第一引数で指定された文字が存在しないからです。
指定された文字が存在しない場合は、

```
-1
```

となります。これが-2とかになることはありません。
以上になります。

次に、指定された範囲の文字を取得するメソッドを紹介します。

これは指定した範囲の文字列を抽出するメソッドです。
先程のように、数字を返してくるのではなく、抽出した文字を戻り値として返します。
なので、
「指定した範囲の部分の内容に応じて処理を変えたい。」という時に便利です。

文法としては2つの書き方があります。

```
１．substring(引数の数値の値);
２．substring(引数の数値の値,　引数の数値の値);
```

## 文法1つ目(substring())

substring()の()の中に引数を入れると、引数で指定された文字から先頭をすべて取得することができます。実際にやると

```main.java
class Main {
    public static void main(String args[]){
        String str = "あいうえお";
        System.out.println(str.substring(0));
      }      
}
```

substring()の引数に0が指定されているので、
先頭の`あ`から検索がかかります。なので出力結果は

```
あいうえお
```
となります。
でもこれだけだと範囲を選択できなくて不便なので、範囲を選択できるやり方を紹介します。

## 文法2つ目(substring())

次に、substringの引数を2つ指定することで、範囲を指定できるやり方について紹介します。

やり方としては、

```Main.java
class Main {
    public static void main(String args[]){
        String str = "あいうえお";
        System.out.println(str.substring(0, 4));
      }      
}
```

上記の`substring(0,4)`のように引数を2つ指定するだけです。
出力結果は

```
あいうえ
```

となります。
ここで疑問に思うかもしれませんが、じつは引数を指定するやり方があるのですが、少し複雑なところがあるので混乱しないように気をつけてください。
説明すると、
「始まりの位置以上、終わりの位置未満まで指定する」
というものです。
なので、第2引数をの所で４と指定されていますが、これは4番目の文字を指定するのではなくて「4未満」なので、上記のコードの場合は0番目から3番目までの文字を検索して抽出します。
皆さん扱うときは気をつけてください。

今度は、指定された文字を反転させるメソッドを紹介します。

# startsWith()メソッド
substring()メソッドは引数の値で対象の文字列が始まるのかを判定するメソッドです。
戻り値としてtrue/falseが返ってきます。
やり方について解説します。

## 文法(startsWith())
startsWith()メソッドの文法について解説します。

```main.java
class Main {
    public static void main(String args[]){
        String str = "あいうえお";
        System.out.println(str.startsWith("a")); //false
        System.out.println(str.startsWith("あ")); //true
      }      
}
```

対象の文字列である変数strに対して、`.`をつけてつなげて、`startsWith();`の引数の中に検査したい文字を入れます。
このコードを実行すると、出力してみると

```
false
true
```

となります。最初に`a`という文字から始まるかを判定します、この場合aから始まっていないので出力結果は`false`になります。
次に、`"あ"`から始まるかを判定します。変数strは`あ`から始まるので、戻り値としては`true`になります。
ただ、これは最初に何が始まるのかを判定するものなので、拡張子が何なのかで判定したい場合は不便です。
これしか使えないと、文字列をreverseして反転させて、そこからstartsWith()で判定しないといけないので、くっそ不便です。
.txtかどうかを判定したいのに、これをいちいち反転させてやるとなると、

```
変数.startsWith(txt.);
```

なんていうあとから見たらまじでクソみたいなコードになるので、こうならない対処法を次に解説しています。

# endsWith()メソッド

これは先程言った問題を解決するためのメソッドです。
これは先程と反対に
「引数で指定された文字で終わるかどうか」
を判定するメソッドです。
これを使えば、先程行った拡張子を判定する時に

```
変数.startsWith(txt.);
```
なんていうクソコードをやめることができます。
あとreverseするときはStringBuilderオブジェクトを生成しないといけません。
こんなクソコードを書くためにオブジェクトを生成するのはだるいので、この機会に覚えます。

# 文法(endsWith())

```main.java
class Main {
    public static void main(String args[]){
        String fileName = "hoge.txt";
        System.out.println(fileName.endsWith(".html")); //false
        System.out.println(fileName.endsWith(".txt")); //true
      }      
}
```

上記のように、変数fileNameにフィアル名を格納します。
そして、`filenname.endsWith()`とすることで引数の値でファイル名が終わるかどうかを判定します。

最初の判定で、`.html`になるかどうかを判定していますが、変数fileNameの拡張子は.txtなのでこれは`false`になります。
次の判定で、変数fileNameが`.txt`で終わるかどうかを判定していますが、これはその拡張子で終わるので`true`になります。

# charAt()メソッド
これは、引数の値(数値)で指定されたところが何なのかを戻り値として返します。

## 文法(cahrAt())

```main.java
class Main {
    public static void main(String args[]){
        String str = "あいうえお";
        System.out.println(str.charAt(0)); 
      }      
}
```

上記の様に、`str.cahrAt(0);`として、引数の値に0をしていするので0番目、つまり一番最初の文字を指定します。
よって出力結果は

```
あ
```

となります。
でも抜き出すだけだとなんに使うんだとと思うと思うので、抜き出した文字を変更できるメソッドについて解説したいと思います。

# replace()メソッド

これを使えば先程解説したcharAt()で抽出した文字を変更させたりする事ができます。

## 文法(replace())

```main.java
class Main {
    public static void main(String args[]){
        String str = "あいうえお";
        str.charAt(0);
        System.out.println("replaceする対象の文字" + str.charAt(0)); 
        String targetWord = String.valueOf(str.charAt(0));
        System.out.println(str.replace(targetWord, "か"));
      }      
}
```

上記で`replace（targetWord, "か"）`とすることで、変数targetWordで抽出された文字である`あ`を`か`に変更することができました。
この時に注意なのですが、replaceの引数はStringしか使うことができません。
なので、replaceの引数に

```
System.out.println(str.replace(str.charAt(0), "か"));
```
として、直接指定させようとしてもできません。
これをしてしまうと、

```
main.java:6: エラー: replaceに適切なメソッドが見つかりません(char,String)
```

となってしまいます。第一引数で指定したところがchar型担っているんですね。
なので使うときはStringに変換して使うようにしましょう。


# reverse()メソッド
これはStringBuilderオブジェクトに格納されているものです。
なので、これを使うときはStringBuilderオブジェクトを宣言する必要があります。やり方としては

```
StringBuilder 変数名 = new StringBuilder();
```

と宣言をすると、StringBuilderオブジェクトが生成されて、StringBuilderオブジェクトのメソッドを使うことができるようになります。
そして、今回の主題である文字列を反転させる手順について解説します。

## 文法（reverse()）

以下、サンプルコードです。

```main.java
class Main {
    public static void main(String args[]){
        StringBuilder sb = new StringBuilder();
        String str = "あいうえお";
        sb.append(str);
        sb.reverse();
        System.out.println(sb);
      }      
}
```

上記のサンプルコードを見ると、`sb.append(str);`でStringBuilderオブジェクトに対して今回反転させたい`あいうえお`の文字列を与えています。そして、StringBuilder型の変数sbに対してreverse();メソッドをつけることで、`System.out.println();`を実行した時に、あいうえおの文字が

```
 おえういあ
```
となって、並び順が逆になっています。
これはStringBuilderオブジェクトを宣言するというところに注意してください。これ宣言しないと`エラー: シンボルを見つけられません`と出てしまいます。
初めて使った時にこれ知らなくて一時間くらい悩んでいた人がいうので間違いありません。

今回は以上になります。
他にもいろいろあるので皆さんやってみてください。