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

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Java | 25 | クラス分割の応用

↓↓クリックして頂けると励みになります。



24 | クラス分割】 << 【ホーム】 >> 【26 | Frameの応用


クラス分けした検索プログラム
クラス分けした検索プログラム



前のセクションで学んだクラス分割を応用して、簡単な検索プログラムを作成します。




Visual Studio Codeで以下の3つのプログラム「Person.java」「AddressBook.java」「SearchTest.java」を作成します。


新規作成1 【Person.java】

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

新規作成2 【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( "佐藤五郎", "福岡" ),
		};
	
}

新規作成3 【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」を実行します。

~/Desktop/Programming/JP $ javac Person.java 
~/Desktop/Programming/JP $ javac AddressBook.java 
~/Desktop/Programming/JP $ javac SearchTest.java
 
~/Desktop/Programming/JP $ java SearchTest     
木村三郎:東京



Visual Studio Codeで以下のプログラム「SearchTest2.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です。


実行結果です。

~/Desktop/Programming/JP $ javac SearchTest2.java

~/Desktop/Programming/JP $ java SearchTest2     
鈴木次郎;青森
木村三郎;東京




24 | クラス分割】 << 【ホーム】 >> 【26 | Frameの応用





↓↓クリックして頂けると励みになります。

YAE C5 CLINIC(札幌美容クリニック)

関連記事(外部サイト)