前のページ
で作成したbinSearchメソッドとそれに対するObjComparableインターフェースの利用です。
その前に少し補足します。ObjComparableインターフェイスは次のように作っていました。
package any; public interface ObjComparable { public int compareTo(ObjComparable o); }
クラスとインターフェイスの違いで説明すます。
汎用化する処理を作る場合、このようなインターフェイスを作って、それを利用して
メソッドを作ります。よく使うアルゴリズムなどでは、それを利用する作り方で作るわけです。
次は前のページで作成したRec23BinSearchクラスの一部で、
上記インターフェイスを利用した部分です。
(本来は、Record2と関係ないクラスなので、これを連想させる名前でないクラス名にすべきでしょう。
また、汎用的に使うクラスなのでmainを作らないクラスにすべきでしょう。)
package rec; import rec.Record2; import any.ObjComparable; public class Rec23BinSearch //←Record2を連想させない名前の方がよい { ・・・・省略・・・・ //バイナリーサーチ2分探索(binary search ) public static int binSearch(ObjComparable[] a, ObjComparable key, int iStart, int iEnd){ int iL = iStart; //現在の探索範囲で、先頭の添え字(左) int iR = iEnd - 1; //現在の探索範囲で、末尾の添え字(右) while (iL <= iR){ int iC = (iL + iR) / 2; //現在の探索範囲で、中央の添え字(中心) ObjComparable rec = a[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; //見つからない } }
以下で、上記のbinSearchの使う新しい例を示します。(Record2と関係ないクラスの例です)
x,y,zのメンバを持つMyPointクラスで確認します。
このクラスで、MyPointの配列を作り、その中で、xのフィールドの値が一致するものを探す例です。
このクラス図を参考に示します。このようにインターフェイスの図では、○の記号以外に破線△矢印を用いることがあります。
■■■■の部分を正しく直しましょう。
←正しく修正してからクリックください。
←わからない場合は、クリック