右下のようなクラスがあり、それを使った実験用の配列を生成し、その配列を取得するため、 以下のクラスがあるとします。(ここで、作成しました。)
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);
}
・・・・・・省略・・・・
}