第9章 クラスライブラリについて
9.2 文字列を扱うクラスについて
通常、JDKが正しくインストールされていれば、基本的なクラスは直ぐに利用できるようになっています。
そこでまずは文字列を扱うためのStringクラスを詳しく紹介していきます。
Stringはクラスですが、これまでの使い方により、基本データ型(int、double)の1つと思っていたのではないでしょうか。実際はそうではなくStringは文字列(string)関連の必要な処理(機能)をそれぞれメソッドとしてまとめたクラスです。”Hello World!”や”今日はいい天気ですね!”と言った具体的な文字列がオブジェクトに該当します。
new演算子を利用してStringクラスの生成Stringもクラスの為、これまで学習してきたように、「new演算子」を使って文字列を生成することも可能です。
従来の方法
String str = “Hello World!”;
new演算子を利用する方法
String str = new String(“Hello World!”);
記述時の使いやすさの為、文字列を扱う場合は従来の方法で行うことをお勧めします。当テキストでは従来の方法を用いていきます。
String型は、これまで文字列を扱うために様々な所で利用してきました。Stringはクラスなので表9.2-1のような各メソッドが用意されています。これらのメソッドを利用すれば文字列を様々な方法で扱うことができます。
上記で紹介した以外にも便利なメソッドがあります。他にどのようなものがあるか調べてみることをお勧めします。
では次の項よりStringクラスのメソッドを利用したサンプルを紹介していきます。
9.2.1 文字列の長さと1文字を取り出すプログラム
ある文字列の長さと、指定した位置の1文字を取得して結果の画面表示を行います。文字列の長さや任意の位置の1文字を取得するメソッドの使い方について学習しましょう。
① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: LengthCharAt
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
package jp.co.f1.basic.ch09; public class LengthCharAt { public static void main(String[] args) { String str = "Java学習開始!"; // 文字列を設定 char ch1 = str.charAt(0); // 1文字目を取得 char ch7 = str.charAt(6); // 7文字目を取得 int len = str.length(); // 文字列の長さを取得 // 結果を表示 System.out.println("「" + str + "」の1番目の文字は「" + ch1 + "」です。"); System.out.println("「" + str + "」の7番目の文字は「" + ch7 + "」です。"); System.out.println("「" + str + "」の文字の長さは「" + len + "」です。"); } }実行結果
解説
6、7行でcharAtメソッドを利用し、指定した1文字を取得して各char型変数に代入しています。
charAtメソッドの引数に「0」を指定すると1文字目の「J」、「6」を指定すると7文字目の「開」となります。図9.1.2を見ても分かるように文字の順番は0から開始していることに注意して下さい。
そして10行目でlengthメソッドを使用し、文字の長さを取得してint型の変数lenに文字の長さ「9」を代入しています。
char ch1 = str.charAt(0); //1文字目を取得 char ch7 = str.charAt(6); //7文字目を取得 int len = str.length(); //文字列の長さを取得
図 9.2.1: 文字列の仕組み
9.2.2 文字列同士を比較するプログラム
文字列同士をequalsメソッドを用いて比較し、その結果を画面に出力して確認を行います。文字列同士の比較するメソッドの使い方について学習しましょう。
① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: StringEquals
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
package jp.co.f1.basic.ch09; public class StringEquals { public static void main(String[] args) { // 変数宣言 String str1 = "おはようございます"; String str2 = "こんにちは"; String str3 = "さようなら"; String str4 = "こんにちは"; // 変数と指定の文字列で比較を行う if (str1.equals("おはようございます")) { System.out.println("str1(" + str1 + ")の文字列は、「おはようございます」と同じです。"); } // 変数と変数で比較を行う if (str2.equals(str4)) { System.out.println("str2(" + str2 + ")と、str4(" + str4 + ")の文字列は同じです。"); } // 文字列が指定の文字列と違う場合の判定方法 if (!str2.equals(str3)) { System.out.println("str2(" + str2 + ")と、str3(" + str3 + ")の文字列は同じではありません。"); } } }実行結果
解説
6~9行目で各String変数を宣言し指定した文字列で初期化を行っています。
String str1 = "おはようございます"; String str2 = "こんにちは"; String str3 = "さようなら"; String str4 = "こんにちは";
12行目でStringクラスが用意している「equals」メソッドを利用して文字列比較を行っています。
String変数str1の文字列と、equalsメソッドの引数に設定した文字列(”おはようございます”)を比較して、同じ文字列ならifブロック内の処理を行います。
if(str1.equals("おはようございます")){ System.out.println("str1(" + str1 + ")の文字列は、「おはようございます」と同じです。"); }
上記処理の実行結果
続いて17行目~19行目ではString変数str2の文字列と、equalsメソッドの引数に設定したString変数str4の文字列を比較しています。どちらも同じ”こんにちは”が設定されているので、比較した結果は実行結果からも分かるように同一と判断されifブロック内の18行目の処理が行われ正しく判定されています。
if(str2.equals(str4)){ System.out.println("str2(" + str2 + ")と、str4(" + str4 + ")の文字列は同じです。"); }
上記処理の実行結果
最後に22行目~24行目では「!」を利用することで、String変数str2の文字列とstr3の文字列が違うかどうかを判定しています。比較した結果は実行結果から分かるように、str2とstr3は同一ではないと判断されifブロック内の23行目の処理が行われ正しく判定されています。
if(!str2.equals(str3)){ System.out.println("str2(" + str2 + ")と、str3(" + str3 + ")の文字列は同じではありません。"); }
比較するなら「==」でもいいのではないかと思いますが、それでは文字列の比較は行えません。
比較できない理由はString型が基本データ型ではなく、クラス型(参照型)であることです。Javaプログラミングでは文字列を比較する場合は、「==」ではなく必ずequalsメソッドを利用して行うものだと覚えて下さい。
ポイント
- 文字列を比較する場合は専用のequalsメソッドを利用して行う。
「==」と「equals」の比較対象の違い「equalsメソッド」は「文字列」を比較する場合に用いるもので、「==」は「基本データ型(int、double、boolean等)」を比較する時に用いるものです。比較を行う場合、この2つしかないので間違えないように覚えておきましょう。
9.2.3 文字列の分割を行うプログラム
文字列を任意の位置や指定文字で分割して、結果を画面に表示して確認します。
substringメソッドpublic String substring(int beginIndex, int endIndex){・・・}
パラメータ(引数):
beginIndex – 開始インデックス (この値を含む)
endIndex – 終了インデックス (この値を含まない)※省略可能
対象の文字列から部分文字列である新しい文字列を返します。部分文字列とは、指定されたbeginIndexから始まり、endIndex – 1にある文字までです。したがって、部分文字列の長さはendIndex-beginIndexになります。
public String[] split(String regex){・・・}
パラメータ(引数):
regex – 分割する区切り文字列
対象の文字列から指定された区切り文字列で分割した文字列配列を返します。対象になる区切り文字列は含まれません。
① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: StringSplit
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
package jp.co.f1.basic.ch09; public class StringSplit { public static void main(String[] args) { // 変数宣言 String str1 = "12345"; String str2 = "AB:CD:EF"; // substringメソッドを利用して任意の位置で分割 System.out.println("「" + str1 + "」の先頭から3文字目は「" + str1.substring(0, 3) + "」です。"); System.out.println("「" + str1 + "」の3文字目から最後の文字は「" + str1.substring(2) + "」です。\n"); // splitメソッドを利用して指定文字「:」で分割 String[] strArray = str2.split(":"); // 分割された数分だけループ処理 for (int i = 0; i < strArray.length; i++) { System.out.println("「:」で分割した" + (i + 1) + "つ目の文字は「" + strArray[i] + "」です。"); } } }実行結果
解説
6行~7行目で文字列分活用の文字列変数を宣言し、各値を同時に設定しています。
String str1 = "12345"; String str2 = "AB:CD:EF";
10行目では「substring」メソッドを利用して、String変数str1の文字列を分割しています。
substringメソッドの第1引数「0」、第2引数に「3」が設定されています。第1引数分割の始まりの文字位置を示し、第2引数は終了文字位置を示しています。但し終了文字位置の文字は含まれないことに注意して下さい。実行結果からも分かるように、先頭から3文字目(4文字目は含まない)の「123」が抜き出されて表示されています。
System.out.println("「" + str1 + "」の先頭から3文字目は「" + str1.substring(0,3) + "」です。");
図 9.2.2:引数2つのsubstringメソッドの文字列分割
続いて11行目ですが、こちらも同じ「substring」メソッドを利用していますが、引数の数が違っています。
10行目と違い引数が1つのは場合は、引数の文字位置から最終文字位置まで分割する仕組みになります。
実行結果からも分かるように、3文字目から最後の文字の「345」が抜き出されて表示されています。
System.out.println("「" + str1 + "」の3文字目から最後の文字は「" + str1.substring(2) + "」です。\n");
図 9.2.3: 引数1つのsubstringメソッドの文字列分割
次に14行目では「split」メソッドを利用し、引数に指定した文字をキーに文字列を分割します。戻り値は分割された数分の文字列型配列になります。指定したキーは含まれないので注意して下さい。
String[] strArray = str2.split(":");
今回の文字列「AB:CD:EF」ではキー文字の「:」が2つあるので文字列は3分割され配列に格納されています。
17行目から19行目でループ処理を利用して配列の全ての値を画面に表示しています。
for(int i=0;i < strArray.length;i++){ System.out.println("「:」で分割した" + (i+1) + "つ目の文字は「" + strArray[i] + "」です。"); }
図 9.2.4: splitメソッド処理の流れ
今回は「:」で分割を行いましたが、文字や数字でも他の記号「,(カンマ)」、「/(スラッシュ)」でも分割を行うことができますので覚えておいて下さい。
Stringクラスには他にも便利なメソッドがありますので、作成するプログラムに合わせて利用してみて下さい。
9.2.4 その他のクラスについて
Srtingクラス以外にも便利なクラスはたくさんあります。Java入門でも紹介していた、数学的な計算を行う機能をまとめたMathクラス、日付を操作するDateクラス、数値のフォーマット形式に関する機能をまとめたNumberFormatクラス、可変長で配列データを扱うArrayListクラス、基本データ型に関するラッパクラスなど紹介しきれないほどたくさんあります。ラッパクラス(wrapper class)のwrapとは「何かを包む」という意味になり、基本データ型を包み、それらに関する様々な機能を提供しているクラスになります。
上記が示すように基本データ型には対応するラッパクラスが存在しています。ラッパクラスには様々な機能が備わっていますので、どのようなメンバがあるのか確認してみて下さい。
JavaプログラムにおいてArrayListクラスは配列と共に良く使われますので、後の節でその使い方を紹介します。
今回紹介した以外にもたくさん提供クラスはありますので、有効に活用してプログラムをより簡単に行いましょう。