前回はインターフェイスをObjComparable.javaで作成しました。
実は、汎用的に比較のインターフェイスとして、
次のようなComparableインターフェイスが、始めから java.lang
パッケージに用意されているのです。(なお、以下はJDK.1.4以前の古い形式です)
package java.lang; public interface Comparable { int compareTo(Object o);// 実装クラスのオブジェクトのある情報と oを比較 }
これを、Record2のクラスに実装するプログラムは次のようになります。
ObjComparableの代わりにComparableでimplementsします。
(なお、以下はJDK.1.4以前の古い使い方ですが、新しい表現もこの考えが基本になっています。)
public class Record2 implementsany.ObjComparableComparable { ・・・・・・省略・・・・ //java.lang.Comparableインターフェイスのオーバーライドメソッド public int compareTo(any.ObjComparableObject obj) { Record2 rec = (Record2) obj; String s = rec.sho;//商品コード文字列 //Stringの比較メソッドを利用した比較 return this.sho.compareTo(s); } ・・・・・・省略・・・・ }
『Record2のオブジェクトのshoから、rec.shoを引いた値』を戻り値にしています。
つまり、this.shoがrec.shoより大きいなら正の値、等しいならゼロ、
this.shoの方が小さいなら負が戻り値になります。
shoはString型なので、文字列の辞書並びで大小の比較です。
をれを利用する検索メソッドは次のような変更だけです。
これで以前と同じように動作します。(変更箇所は、3箇所です。)
なお、java.langのクラスは、importしなくても使えますが、
以前のプログラムと違いを見せるために、以下では省略していません。
←正しく修正してからクリックください。
←わからない場合は、クリック
なお、JDK1.5で上記を翻訳すると、次のような警告がでますが、コンパイルはできて正しく動作します。
D:\java>javac rec\Rec23BinSearch.java 注: rec\Rec23BinSearch.java の操作は、未チェックまたは安全ではありません。 注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。 D:\java>javac -Xlint:unchecked rec\Rec23BinSearch.java rec\Rec23BinSearch.java:48: 警告: [unchecked] raw 型 java.lang.Comparable の メンバとしての compareTo(T) への無検査呼び出しです。 int val = rec.compareTo(o);//比較 ^ 警告 1 個 D:\java>
この警告は、Comparatorインターフェイスの使い方が、JDK1.4 以下の作り方で、
JDK1.5以上では、避けるべき作り方であるためです。
詳細は後述しますが、このような警告を避ける場合は、
次の指定でコンパイルください。
D:\java>javac -source 1.4 Rec23BinSearch.java D:\java>
-source 1.4の指定で、ソースの書き方が1.4であることを指定しています。