Java オブジェクト指向プログラミング ステップ3(interface)

右下のようなクラスがあり、それを使った実験用の配列を生成し、その配列を取得するため、 以下のクラスがあるとします。(ここで、作成しました。)

package rec;
import rec.Record2;
import rec.Record3;
public class Rec23Data{
	//実験用の配列を生成し、その配列を戻り値とするメソッド
	public static Record2[] getData(){
		Record2[] a = new Record2[]{ 
			new Record2("A01", 1),
			new Record3("A02", 2, 200),
			new Record2("A03", 3),
			new Record2("A04", 4),
			new Record3("B01", 10,1000),
			new Record3("B02", 20,2000),
			new Record2("B02", 30),
			new Record3("B03", 30,300),
		};
		return a;
	}
	// iStart から(iEnd-1)の添え字情報を表示
	public static void display(Record2[] a,int iStart,int iEnd){
		for (int i = iStart; i < iEnd; i++){
			a[i].display(i);
		}
	}

	public static void main(String[] arg){
		Record2[] a = Rec23Data.getData();
		Rec23Data.display(a, 0, 8);//確認用表示
	}
}

このRec23Data.getData()で得られる配列から、 "B02"の商品番号を探す2分探索のプログラムは次のように作れます。 binSearchメソッドで探し、これより見つかった配列の位置(インデックス)を得ています。

package rec;
// import rec.Record2; import rec.Rec23Data;←は書かなくても、同じパッケージであれば使えます。
import any.ObjComparable;
public class Rec23BinSearch {	// 2分探索(binary search )
	public static void main(String[] arg){
		Record2[] a = Rec23Data.getData();
		Record2 key = new Record2("B02", 0);// 探したいデータ
		int iFound = binSearch(a, key, 0, 8); //実際に存在するデータ範囲のを指定
		if (iFound == -1){
			System.out.println("見つかりません");
			System.exit(0);//実行終了
		}
		a[iFound].display(iFound);
	}
	
	//バイナリーサーチ
	public static int binSearch(01 a, 02 key, int iStart, int iEnd){
		int iL = iStart;	//現在の探索範囲で、先頭の添え字(左)
		int iR = iEnd-1;	//現在の探索範囲で、末尾の添え字(右)
		while (iL <= iR)	{
			int iC = (iL + iR) / 2;	//現在の探索範囲で、中央の添え字(中心)
			03a[iC];
			int val = rec.compareTo(key);//比較
			if ( val ==  0  ){
				return iC;//見つかった
			}else if (  val < 0) {//keyが大きい
				iL = iC + 1;
			}else {/* keyが小さい */
				iR = iC - 1;
			}
		}
		return -1; //見つからない
	}
}
D:\java>java Rec23BinSearch
   5番目レコード
        商品コード:B02
        数量:20
        単価:2000

D:\java>


























package any;
public interface ObjComparable {//メソッド宣言だけで作ります。
	public int compareTo( ObjComparable  o);// ←このようなメソッドの宣言だけしている。
}

public class Record2 implements any.ObjComparable
{
	・・・・・・省略・・・・
	
	//any.ObjComparableインターフェイスのオーバーライドメソッド
	public int compareTo(any.ObjComparable obj)
	{
		Record2 rec = (Record2) obj;
		String s = rec.sho;//商品コード文字列

		//Stringの比較メソッドを利用した比較
		return this.sho.compareTo(s);

	}
	
	・・・・・・省略・・・・
}