java.utilパッケージにあるArraysクラスには、Comparableインターフェイスを利用した sortやbinarySearchのメソッドが、用意されており、それを利用します。
右下のようなクラスがあり、それを使った実験用の配列を生成し、その配列を取得するため、
以下のクラスがあるとします。
(配列は、キーとなるshoの商品コードがバラバラに並ぶように変更しました。)
このgetData()で取得できる配列を商品コードで、昇順に整列後、B02を2分探索で検索する例を示します。
package rec; import rec.Record2; import rec.Record3; public class Rec23Data{ //実験用の配列を生成し、その配列を戻り値とするメソッド public static Record2[] getData(){ Record2[] a = new Record2[]{ new Record3("A02", 2, 200), new Record2("A01", 1), new Record2("A03", 3), new Record3("B01", 10,1000), new Record3("B02", 20,2000), new Record2("A04", 4), 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);//確認用表示 } } |
既存のアルゴリズムを使うには、Comparableインターフェイスを実装した配列要素にする必要があります。
JDK 1.5以上のGenerics版Comparableインターフェイスは次のようになっています。これ以前(JDK 1.4以下)の
コードと比較ください。
(java.langパッケージは特別なパッケージで、このパッケージ内のクラスやインターフェイスはimportしなくても利用できます。)
package java.lang; public interface Comparable<T> { public int compareTo(T o); }
よって要素のクラスであるRecord2に、Comparableメソッドを実装します。
以下にその例を示します。
上記<T>を利用する時の
<具体的名前>として、以下で<Record2>を指定しています。
同時にこれは、Record2を作る時の、
<総称的名前>として使っていることになります。
public class Record2 implements Comparable <Record2> { ・・・・・・省略・・・・ public int compareTo(Record2 rec) { String s = rec.sho; //Stringの比較メソッドを利用した比較 return sho.compareTo(s); } ・・・・・・省略・・・・ } |
このComparableが実装されたオブジェクトは、この比較方法に従って、
既にある
java.util.Arrays.sortメソッドで昇順に並び替えることができ、
java.util.Arrays.binarySearchメソッドで2分探索ができます。
以下にその例を示します。 |
D:\java>java Test 0番目レコード 商品コード:A01 数量:1 1番目レコード 商品コード:A02 数量:2 単価:200 2番目レコード 商品コード:A03 数量:3 3番目レコード 商品コード:A04 数量:4 4番目レコード 商品コード:B01 数量:10 単価:1000 5番目レコード 商品コード:B02 数量:20 単価:2000 6番目レコード 商品コード:B02 数量:30 7番目レコード 商品コード:B03 数量:30 単価:300 B02 の商品コードは、次のように見つかりました 5番目レコード 商品コード:B02 数量:20 単価:2000 D:\java>h; |
import rec.Record2; public class Test { public static void main(String[] arg) { //バラバラな配列取得 Record2 [] a = rec.Rec23Data.getData(); java.util.Arrays.sort(a);//並び替え rec.Rec23Data.display(a, 0, a.length); Record2 key = new Record2("B02", 0); //探索 int iFound = java.util.Arrays.binarySearch(a, key); if (iFound == -1){ System.out.println("見つかりません"); System.exit(0);//実行終了 } System.out.print("B02 の商品コードは、"); System.out.println("次のように見つかりました"); a[iFound].display(iFound); } } |
Stringは、Comparableを実装したクラスです。
よって上記と同じように、java.utilパッケージ内のArraysクラスのsortメソッド
やbinarySearchメソッドが、すぐに利用できます。
それは以前に紹介しました。→利用例
Stringクラス以外にも、Comparableの実装クラスはたくさん用意されています。
Boolean、Character 、 Byte 、Short 、Integer 、 Long 、 Flort 、 Double などのクラスは、それぞれ
bool 、 char 、 byte 、short 、int 、 long 、 float 、 double の
基本型を包んだラップクラスで、Comparableインターフェイスが実装されています。
基本型は参照型でないためObjectの配列で管理できません。参照させる場合は、これらラッパークラスと呼ばれるオブジェクトで記憶します。
他にも、日時を管理するDateクラスが既に実装済みです。
Comparableインターフェイスを
下のリンクで確認しましょう。(インターフェイスもクラスと同じように調べることができます)