Stringクラスによる分割

splitメソッド

続いて、文字列を複数に分割する方法について説明します。文字列の分割は、大まかに言って、Stringクラスのメソッドを用いるものと、Scannerクラスを用いるものがあります。ここではまず、Stringクラスのsplitメソッドを利用する方法から紹介します。以下のサンプルを実行してみてください。

ClassSample01.java
package class5;

public class SampleClass01 {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		String str1 = "one,two,three";
		String str2 = "apple orange pineapple";
		String[] strarray1 = str1.split(",");	// ","を基準に文字列を分割し配列に格納
		String[] strarray2 = str2.split(" ");	// スペースを基準に文字列を分割し配列に格納
		//拡張forループを使って配列の中身を出力
		for(String s : strarray1){
			System.out.println(s);
		}
		System.out.println();
		for(String s : strarray2){
			System.out.println(s);
		}
	}

}
実行結果
one
two
three

apple
orange
pineapple

Stringクラスの、splitメソッドは、呼び出したStringに含まれる文字列を引数に指定した文字列で分割するメソッドです。分割された文字列は配列に格納されてその参照が返ります。

このサンプルでは、「","」(str1)と、半角スペース(str2)で分割しています。このように、引数を指定することにより、自由に分割方法を指定することができます。

Scannerクラス

Scannerクラスで分割する

続いて、同様の処理を、Scanner(スキャナー)クラスを用いて行ってみましょう。以下のサンプルを実行してみてください。

ClassSample02.java
package class5;

import java.util.*;

public class SampleClass02 {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		String str1 = "one,two,three";
		String str2 = "apple orange pineapple";
		Scanner sc1 = new Scanner(str1);
		sc1.useDelimiter(",");					//	「,」で区切る
		while(sc1.hasNext()){					//ScannerクラスのhasNext()メソッド
				System.out.println(sc1.next());		//next()メソッドを使い文字を分割
		}
		System.out.println();
		Scanner sc2 = new Scanner(str2);			//文字列を引数にScannerを生成
		while(sc2.hasNext()){					//ScannerクラスのhasNext()メソッド
				System.out.println(sc2.next());		//next()メソッドを使い文字を分割
		}
		sc1.close();
		sc2.close();
	}

}

実行結果は、ClassSample01.javaと同じです。

Scannerクラスはトークン化に最適なクラスで、区切り文字のパターンを使用して1つの文字列(データ)をトークンに分割して扱います。デフォルトの区切り文字は空白文字で、useDelimiter()メソッドでsplit()メソッドと同様に区切り文字の指定することが可能です。

分割したデータの取り出しには、hasNext()メソッドと、next()メソッドを用います。hasNext()メソッドはスキャナの入力に別のトークンが残っている場合trueをそうでない場合falseを返します。next()メソッドは、スキャナから得られる次のトークンをString型で返します。

コンソールから入力した文字列のデータの分割

Scannerクラスが利用できるのは、何もStringクラスのもじれつばかりではありません。次の例は、コンソールから文字列を入力し、それを半角スペースで分割して表示するサンプルを見てみましょう。以下のサンプルを入力し、実行してみてください。

ClassSample03.java
package class5;

import java.util.*;

public class SampleClass03 {

	public static void main(String[] args) {
		System.out.print("Input Data:");
	    Scanner scan = new Scanner(System.in);		//	文字列を入力
	    int i = 1;
	    while(scan.hasNext()){
	    String str = scan.next();
	    	System.out.println(i + " : "+ str);
	    	i++;
	    }
	}

}
実行結果
Input Data:one two three four
1 : one
2 : two
3 : three
4 : four

プログラムを実行すると、画面に「Input Data:」と出力されるので、ここに半角スペースを含んだ文字列のデータを入力してみます。すると、その文字列は、半角スペースでくぎられたトークンに分割されて表示されます。

ポイントは、9行目にある、Scannerクラスの生成です。

キーボードからの入力を受けつける場合の処理
Scanner scan = new Scanner(System.in);

コンストラクタの引数で指定したところから値を読み込もうとします。このサンプルの場合は、「System.in」なので、コンソールから入力された文字列が表示されます。

ファイルからの読み取り

また、Scannerクラスは、ファイルから読み出したデータの分割を行うことも可能です。以下は、csvファイルを分割して表示するサンプルです。

ClassSample04.java
package class5;

import java.io.*;
import java.util.*;

public class SampleClass04 {

	public static void main(String[] args) {
		Scanner sc = null;
		try{
			sc = new Scanner(new BufferedReader(new FileReader("csvsample.csv")));
			sc.useDelimiter(",");					//区切り文字設定
			while(sc.hasNext()){
			System.out.print(sc.next() + " ");	//next()メソッドでトークンを取得
		}
		}catch(FileNotFoundException e){
			System.out.println("ファイルが見つかりません。");
		}finally{
			if(sc != null){
				sc.close();
			}
		}

	}

}

実行する際には、csvsample.csvが必要です。内容は、以下のようにしてください。

csvsample.csv
1,2,3
4,5,6
7,8,9

これを実行すると、以下のようになります。

実行結果
1 2 3
4 5 6
7 8 9

ScannerクラスでBufferedReaderクラス、FileReaderクラスをラップしています。useDelimiter()メソッドでsplit()メソッドと同様に区切り文字の指定をしています。Stringクラスのsplit()メソッドを用いても同様な処理はかのうですが、ScannerクラスでFileReaderクラスをラップしたほうが、より簡単に処理を行うことが可能です。