Java Basic1 〜文字列操作(Stringクラス)の扱い

文字列の操作

1.1 文字列処理とは

ズバリ、文字列を切り貼りします

例:1.1 「文字列を切り取る」
「こんにちは世界」という文字列の"ちは"を切り取ると「こんに世界」になります。
コードで書くと下のようなコードになります。Javaのプログラムで実行する時には下のようなコードで実行します。あくまでもサンプルなのでやり方は自分で考えて作れるようにしたいですね。

処理の内容などは、これから学んでいきます。

/**
 * 文字列の操作。
 *
 */
public class StringControl {

    /**
     * 動かしたいメソッドを呼び出してやれば動かせます。
     * 例として「1.1文字列処理とは」のサンプルコードを呼び出しています。
     *
     * @param args
     */
    public static void main(String[] args) {
        StringControl main = new StringControl();
        main.substringTest();
    }

    /**
     * 「1.1.1文字列処理とは」のサンプルコード。
     * 文字列を切り取る処理のサンプル<br/>
     * <br/>
     * <b>「こんにちは世界」という文字列の"ちは"を切り取る</b>
     */
    public void substringTest() {
        // 変数の初期化
        String moji = "こんにちは世界";
        // *******************************************************//
        // * やり方1:Stringクラスのメソッド「substring()」を呼び出す *
        // *******************************************************//
        String rightStr = moji.substring(0, 3);
        String leftStr  = moji.substring(5, 7);
        System.out.println("切り取った結果1は「" + rightStr + leftStr + "」です。");

        // *******************************************************//
        // * やり方2:char型の配列を取り出してやる                   *
        // *******************************************************//
        char[] charMoji = moji.toCharArray();
        // 切り取った結果を格納する
        char[] resArray = new char[charMoji.length];
        int resCount = 0;
        for (int i = 0; i < charMoji.length; i++) {
            if (i != 3 && i != 4) {
                // 表示する文字を設定(セット)する
                resArray[resCount] = charMoji[i];
                resCount++;
            }
        }
        // char型の配列をStringとして生成
        String resString = new String(resArray);
        System.out.println("切り取った結果2は「" + resString + "」です。");
    }

    /**
     * 「1.2.1とは」のサンプルコード。
     * 文字列を調査するサンプル<br/>
     * <table>
     *     <thead>
     *         <tr><th>操作</th></tr></tr>
     *         <th>メソッド定義(シグニチャ)</th></tr>
     *     </thead>
     *     <tbody>
     *         <tr><td>内容が等しいか調べる</td></tr>
     *         <tr><td>public boolean equals(Object o)</td></tr>
     *     </tbody>
     * </table>
     */
    public void checkString() {

        String moji = "test";

        // String#equals()
        if (moji.equals("test")) {
            System.out.println("mojiは\"test\"です。");
        } else {
            System.out.println("mojiは\"test\"ではありません。");
        }

        // String#equalsIgnoreCase()
        if (moji.equalsIgnoreCase("Test")) {
            System.out.println("mojiは\"Test\" or \"Test\"です。");           
        } else {
            System.out.println("mojiは\"Test\" or \"Test\"ではありません。");          
        }

        // String#isEmpty()
        if (moji.isEmpty()) {
            System.out.println("mojiは\"\"です。");
        } else {
            System.out.println("mojiは\"\"ではありません。");
        }
    }
}

1.2 基本的な文字列操作

操作 メソッド定義(シグニチャ)
内容が等しいか調べる public boolean equals(Object o)
大文字小文字を区別せず内容が等しいか調べる public boolean equalsIgnoreCase(String s)
文字列長を調べる public int length()
空文字か調べる public boolean isEmpty()

Sample1 1-1 文字列調査メソッドを利用した例

※クラス全体ではなく、メソッド部分のみを記述します。

使用するメソッド一覧
String#equals()
String#equalsIgnoreCase()
String#isEmpty()

/**
 * 文字列調査(文字列が等しいか?)のサンプル。
 * 「リスト1-1 文字列調査メソッドを利用した例」
 */
public void sample1_1StringEquals() {
    // 文字列を比較した場合
    System.out.println("*** String#equals() Sample1 ****");
    if ("test".equals("tezt")) {
        System.out.println("\"test\"と\"tezt\"は等しいです。");
    } else if ("test".equals("tezt") == false) {
        System.out.println("\"test\"と\"tezt\"は等しくありません。");
    } else {
        // 実際は例外しか返ってこないので意味のないコード
        // 想定外のケースも考慮に入れる
        System.out.println("trueもfalseも帰ってこなかった場合。");
    }
    System.out.println("*** String#equals() Sample2 ****");
    // 変数に入れた文字列を比較した場合
    String str = "test";
    String str2 = "tezt";
    if (str.equals(str2)) {
        System.out.println("\"test\"と\"tezt\"は等しいです。");
    } else {
        System.out.println("\"test\"と\"tezt\"は等しくありません。");
    }
    System.out.println("*** String#equalsIgnoreCase() Sample1 ****");
    if ("test".equalsIgnoreCase("tezt")) {
        System.out.println("\"test\"と\"tezt\"は等しいです。");
    } else if ("test".equalsIgnoreCase("tezt") == false) {
        System.out.println("\"test\"と\"tezt\"は等しくありません。");
    } else if ("test".equalsIgnoreCase("Test")) {
        System.out.println("\"test\"と\"Test\"は等しいです。");
    } else {
        // 実際は例外しか返ってこないので意味のないコード
        // 想定外のケースも考慮に入れる
        System.out.println("trueもfalseも帰ってこなかった場合。");
    }

    System.out.println("*** String#isEmpty() Sample1 ****");
    if ("".isEmpty()) {
        System.out.println("文字列は空です。");
    }
    String tmp = null;

    System.out.println("*** String#isEmpty() Sample2 ****");
    try {
        if (tmp.isEmpty()) {
            System.out.println("文字列はNULLです。");
        }
    } catch (NullPointerException e) {
        System.out.println("実行するとNullPoineterExceptionで落ちる。");
    }
}

Sample1: 文字列の調査メソッドの解説

  1. "test".equals("tezt")は、"test"と"tezt"を比較している2つの文字列が等しいならifの中に処理が進む
  2. "test".equals("tezt") == falseは2つの文字列を比較した時の返り値がfalseの場合ifの中に処理が進む
  3. str.equals(str2)は変数「str」と「str2」を比較した時の返り値がtrueの場合ifの中に処理が進む
  4. "test".equalsIgnoreCase("tezt") == falseは下の内容の処理を行っているので「大文字小文字の区別無し」で文字列の比較した時の返り値がtrueの場合ifの中に処理が進む ※Stringクラスのソースファイル参照
    public boolean equalsIgnoreCase(String anotherString) {
    return (this == anotherString) ? true
            : (anotherString != null)
            && (anotherString.value.length == value.length)
            && regionMatches(true, 0, anotherString, 0, value.length);
    }
  5. "test".equalsIgnoreCase("Test")は"test"と"Test"を比較した時の返り値がtrueの場合ifの中に処理が進む
  6. "".isEmpty()は""が空文字だった場合ifの中に処理が進む
  7. String tmp = null;`は変数`tmpにNULLを代入している、この変数を参照するとNullPointerExceptionで落ちる
  8. try { 何かの処理 } catch ( キャッチする例外 ) { 例外時の処理 }で例外が起きた時の処理を行う。

Sample2 1-2 文字列検索メソッドを利用した例

※クラス全体ではなく、メソッド部分のみを記述します。

使用メソッド一覧
String#contains()
String#endsWith()
String#indexOf()

/**
 * 文字列調査(文字列が等しいか?)のサンプル。
 * 「リスト1-2 文字列検索メソッドを利用した例」
 */
public void sample1_2StringSearch() {
    String str = "0123456789ABCABC";
    System.out.println("*** String#contains() Sample1 ****");
    if (str.contains("012")) {
        System.out.println(str + "は「012」を含んでいます。");
    }
    System.out.println("*** String#contains() Sample1 ****");
    if (str.contains("014")) {
        System.out.println(str + "は「014」を含んでいます。");
    } else {
        System.out.println(str + "は「014」を含んでいません。");
    }

    System.out.println("*** String#endsWith() Sample1 ****");
    if (str.endsWith("ABC")) {
        System.out.println(str + "は「ABC」を末尾にあります。");
    }

    System.out.println("*** String#endsWith() Sample1 ****");
    System.out.println(str + "は「ABC」の文字列が" + str.indexOf("ABC") + "番目に出現します。");
    System.out.println(str + "は「ABC」の文字列が最後に出現するのは" + str.lastIndexOf("ABC") + "番目に出現します。");
}

文字列検索メソッドの解説

  1. str.contains("012")で文字列strに"012"が含まれているか検証しています。含まれているならばtrueを返します。そうでない場合はfalseを返す
  2. str.endsWith("ABC")で文字列strの末尾に"ABC"があるか検証しています。末尾にあればtrue, なければfalseを返す。
  3. str.indexOf("ABC")で文字列str内の"ABC"がはじめに出現する位置(int型)を返します。
  4. str.indexOf("ABC")で文字列str内の"ABC"が最後に出現する位置(int型)を返します。

正規表現を使う

上に記載したもの以外にも、よく使うメソッドを紹介します。

String#matchies()です。

このメソッドは、引数に正規表現を渡して、その正規表現にマッチするならtrue, そうでないならfalseを返します。

正規表現は後々に学習します。とりあえずは下の「数字」とaからz、AからZまでの文字にマッチするケースです。

チェック処理なので、静的メソッドにしています。

public static boolean isNumber(String numberStr) {
    // numberStr0から9のうちどれかに該当するか判定します。(1文字だけ)
    if (numberStr.matches("[0-9]")) {
        return true;
    }
    return false;
}

上の処理は、numberStrが数字1文字で、0から9に該当するかどうかの判定を行なっています。

文字数を複数にする場合は後ろに、「{2,5}」のようにつけると「2桁から5桁の間の0から9の数字」というような意味になります。