java.utilパッケージにあるArraysクラスには、
任意オブジェクトの配列を操作するさまざまなメソッドが既に用意されています。
下のリンクで調べてみましょう。
右下のようなクラスがあり、それを使った実験用の配列を生成し、その配列を取得するため、
以下のクラスがあるとします。
(配列は、キーとなる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インターフェイスを実装した配列要素にする必要があります。
よって要素のクラスであるRecord2に、Comparableメソッドを実装します。
以下にその例を示します。
(JDK 1.4以下で使われる古い表現ですが、基本的な考え方で作ったコードです。)
public class Record2 implements Comparable { ・・・・・・省略・・・・ public int compareTo(Object rec) { Record2 rec2 = (Record2)rec;//キャスト String s = rec2.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インターフェースを実装したクラスです。 (compareToメソッドをオーバーライドしています。) よって上記と同じように、java.utilパッケージ内のArraysクラスのsortメソッド やbinarySearchメソッドが、すぐに利用できます。 以下にその例を示します。
import java.util.Arrays; public class Test { public static void main(String[] arg) { String [] a = { "wxyz", "ab", "abc", "opqrstu", "あいう", "いう", "123", }; Arrays.sort(a);//並び替え for(int i=0; i < a.length; i++){ System.out.println(i + " :" + a[i]); } int iFound = Arrays.binarySearch(a, "wxyz");//2分探索 System.out.println("wxyzは、" + iFound + "番目です"); } } |
D:\java>java Test 0 :123 1 :ab 2 :abc 3 :opqrstu 4 :wxyz 5 :あいう 6 :いう wxyzは、4番目です D:\java>h; |