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インターフェイスを
下のリンクで確認しましょう。(インターフェイスもクラスと同じように調べることができます)