アルゴリズムとクラスの設計

第12回:クラスの設計(2)
プログラミングII
2007年12月11日
本日の講義内容
Java のクラスの設計(その2)
 「部品」の「部品」を作る
 「部品」のクラスによるメソッドの提供
 実用的なサンプル
「住所録」からの検索の実現

復習)クラスの設計(その1)


クラス名は Elephant
「名前」と「年齢」の情報を記憶
public class Elephant {
public String name;
public int age;
}
コンストラクタの追加
public Elephant ( String s, int i ) {
name = s;
age = i;
}
public Elephant() {
name = “”;
age = 0;
}
インスタンスの情報を処理

インスタンスの情報を文字列として返す
public String toString() {
String info = “Name:” + name
+”,Age:” + age;
return info;
}
インスタンスの情報の扱いの工夫



「年齢」は更新処理が必要
「年齢」から「生まれた年」に変更
int bornYear;
「年齢」=「現在の年」-「生まれた年」
で計算できる
「現在の年」を知るには?





java.lang の Systemクラス
currentTimeMillis()メソッド
(ミリ秒での情報 – そのままでは不便)
java.util パッケージの Calendar クラス
各インスタンスは日時の情報を記憶
現在の日時の取得
時刻を取り扱うためのメソッドと定数
java.util.Calendar の扱い



「現在の日時」のインスタンスの取得
Calendar cal = Calendar.getInstance();
cal から必要な情報を取り出す get()
「必要な情報」を指定する定数
Calendar.YEAR, Calendar.MONTH,
Calendar.DAY_OF_MONTH,
Calendar.HOUR_OF_DAY,
Calendarの利用例

今日が何日なのか?
Calendar cal = Calendar.getInstance();
int day
= cal.get( Calendar.DAY_OF_MONTH );
クラスの設計の改良

toString()メソッドの中で年齢を計算
int bornYear;
:
public String toString() {
int thisYear =
calendar.get( Calendar.YEAR );
int age = thisYear - bornYear;
Java のクラスのポイント


他のプログラムから再利用される
あらかじめ「親切」に設計しておく
複数のコンストラクタの定義
データを取り扱うためのメソッドの定義
本日取り扱うクラス



Person クラス
個人の情報(名前と住所)を取り扱う
「検索処理」の対象となる
Person のフィールド
public class Person {
public String name;
public String address;
:
:
Person のコンストラクタ
public Person( String s1, String s2 ) {
name = s1;
address = s2;
}
*呼び出し側
Person person
= new Person( “植田龍男”, “富岡3丁目”);
Personの toString()メソッド

「名前」:「住所」の形式で情報を返す
public String toString() {
String info= name + “:” + addresss;
return info;
}
nameEquals() メソッドの追加
検索した時の一致・不一致を判定
 指定された文字列と一致 – true
 指定された文字列と不一致 – false
public boolean nameEquals( String s ) {
return name.equals( s );
}


String クラスのメソッド equals() を利用
もう1つのクラス AddressBook


やはり「部品のクラス」(実行はできない)
内部に複数の Person のインスタンス
public class AddressBook {
public Person[] data;
:
AddressBookのコンストラクタ

外部から与えられた場合
public Person[] data;
:
public AddressBook ( Person[] data ) {
this.data = data;
}
AddressBookのコンストラクタ(2)

指定が省略 – 仮のテスト用のデータを用意
public static Person[] sample = {
new Person( “丸山不二夫”, “富岡2” ),
new Person( “金山典世”, “富岡4” ),
:
}
public AddressBook() {
data = sample;
AddressBook に検索のメソッド
public void searchNameEquals( String s ){
for( int i=0; i<data.length; i++ ) {
if( data[i].nameEquals( s ) ) {
System.out.println( data[i] );
}
}
}
AddressBookの利用例
public class SearchTest1 {
public static void main( String[] args ) {
AddressBook book
= new AddressBook();
book.searchNameEquals( args[0] );
}
}
さらに便利になるように工夫






Stringの equals() は「完全一致」
より柔軟な比較 – matches() メソッド
「正規表現」と呼ばれるものを利用
.* -- 「ある文字が何文字か」
.*山 -- 「丸山」にも「金山」にも一致
Person, AddressBookにメソッドを追加!