学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その23 クラス分けした検索プログラム

<<前  [TOP]  次>>


メモ帳を開いて次の3つのプログラムを作ってみましょう。


Person.java 直

public class Person {
	public String name;
	public String address;
	public Person( String s1, String s2 ) {
		name = s1;
		address = s2;
	}
}

AddressBook.java 直

public class AddressBook {
	private Person[] data;
	public AddressBook() {
		data = sample;
	}
	public AddressBook( Person[] data ) {
		this.data = data;
	}
	public void setData( Person[] data ) {
		this.data = data;
	}
	public Person[] getData() {
		return data;
	}
	private static Person[] sample = {
		new Person( "山田太郎", "北海道" ),
		new Person( "鈴木次郎", "青森" ),
		new Person( "木村三郎", "東京" ),
		new Person( "高橋四郎", "広島" ),
		new Person( "佐藤五郎", "福岡" ),
		};
	
}

SearchTest.java 直

public class SearchTest {
	public static void main( String[] args ) {
		AddressBook book = new AddressBook();
		String[] result = searchStartsWith( book.getData(), "木" );
		printData( result );
	}
	public static String[] searchStartsWith( Person[] data, String head ) {
		int count=0;
		for( int i=0; i<data.length; i++ ) {
			if( data[i].name.startsWith( head ) ) {
				count++;
			}
		}
		String[] result = new String[count];
		for( int i=0,j=0; i<data.length; i++ ) {
			if( data[i].name.startsWith( head ) ) {
				result[j++]=data[i].name + ":" + data[i].address;
			}
		}
		return result;
	}
	public static void printData( String[] data ) {
		for( int i=0; i<data.length; i++ ) {
			System.out.println( data[i] );
		}
	}
}



最初に”木”がついている人の名前データを表示するプログラムです。


「Person.java」はフィールドに値を代入するコンストラクタがあるクラスです。


「AddressBook.java」にはpersonクラスのインスタンス配列sampleがあります。


this.data = data;は、次のコンストラクタのdata = sample;の部分を指します。
thisはこのような使い方もできます。

public AddressBook() {
    data = sample;
}



次のメソッドは、単にdataインスタンス配列を返すメソッドです。

public Person[] getData() {
    return data;
}



「SearchTest.java」を見てみましょう。

for( int i=0; i<data.length; i++ ) {
    if( data[i].name.startsWith( head ) ) {
        count++;
    }
}

もし、nameの最初の文字が”木”ならcountをインクリメントします。
このcountは、結果を残す配列result[]のメモリを確保するときに使います。


出力結果です。
「Person.java」「AddressBook.java」「SearchTest.java」の3つをコンパイルして、「SearchTest.java」を実行します。





メモ帳を開いて次のプログラムを作ってみましょう。


SearchTest2.java 直

public class SearchTest2 {
	public static void main( String[] args ) {
		AddressBook book = new AddressBook();
		String[] result = searchChar( book.getData(), '木' );
		printData( result );
	}
	public static String[] searchChar( Person[] data, char c ) {
		int count=0;
		for( int i=0; i<data.length; i++ ) {
			String line = data[i].name + data[i].address;
			if( line.indexOf( c ) != -1 ) {
				count++;
			}
		}
		String[] result = new String[count];

		for( int i=0,j=0; i<data.length; i++ ) {
			String line = data[i].name + ";" + data[i].address;
			if( line.indexOf( c ) != -1 ) {
				result[j++] = line;
			}
		}
		return result;
	}

	public static void printData( String[] data ) {

		for( int i=0; i<data.length; i++ ) {

			System.out.println( data[i] );
		}
	}
}



名前のどこかにに”木”がついている人のデータを表示するプログラムです。


indexOf( c )はjavaのパッケージに含まれるメソッドで、与えられたインスタンスの中に指定された文字が(今回はc)入っていたら0(true)を返します。
それ以外は-1(false)を返します。
trueを数字で表すと0、falseを数字で表すと-1です。


実行結果です。





<<前  [TOP]  次>>