Javaのお勉強その17
- コンパレータ
コレクションや配列を自分が決めた順序でソートしたい場合には、Comparatorを実装するクラスを書く。C言語で言うところのqsort関数に渡す関数ポインタみたいなもの。コンパレータは次の形式である。
public int compare(値1,値2)
値1が値2より小さい場合は負、等しい場合は0、値1が値2より大きい場合は正の整数を戻すように定義する。
自分で順序を決めたいものの型をXとするとき、コンパレータは次のようになる。
class MyComparator implements Comparetor
{ public int compare(X x1, X x2){ return (x1,x2の比較結果); } } 例えば、数値を絶対値の小さい順に並べるコンパレータは次のようになる。このようなコンパレータをArrays.sortの引数や、Collections.sortの引数に与えることで、自分の基準でソートができる。
class MyComparator implements Comparetor
{ public int compare(Integer x1, Integer x2){ return Math.abs(x1)-Math.abs(x2); } } - java.util.comparable
Comparatorとの違いは、自分自身と引数に与えられた値を比較するという点である。次のような形をしており、引数は1つだけになる。
public int compareTo(値)
Xというクラスに自分で定義した順序を与える場合、次のように書く。
class X implements Comparable
{ public int compareTo(X x1){ return (自身とx1との比較結果); } } Comparableを実装しているクラスにはラッパークラス、String、DateCalenderなどがある。
Comparableでは1つのクラスに1つの順序しか与えられないが、Comparatorでは、比較するクラスから独立しており、必要なだけ順序付けを定義することができる。
Comparableを実装した場合、Arrays.sortなどの第2引数の指定は必要なくなる。
- 反復子
コレクションの要素の繰り返しを扱うためのインタフェース。IteratorやIteratorを実装したクラス、オブジェクトを反復子という。List、Setにはiterator()というIteratorを返すメソッドがある。
Listの主なメソッド boolean hasext() さらに要素がある場合にtrueを返す next() 反復子が指している要素を返し、反復子に次の要素を指すようにさせる。 void remove() 反復子によって最後に返された要素を削除する 反復子のサンプルプログラム。要素がそのままの順で1行につき1単語ずつ出力される。
import java.util.*; class ite{ public static void main(String[] args){ List
list = Arrays.asList("This","is","a","pen"); Iterator it = list.iterator(); // 反復子の設定 while(it.hasNext()){ // リストに次の要素があるうちは System.out.println(it.next()); // 注目している値を表示して、次を指すようにせよ。 } } } - Hash関連
HashMap、Hashtableでは、ハッシュと呼ばれる、値を識別キーに対応させる方法を使う。検索の高速化が目的である。
キーはObjectのメソッドであるequalsとhashCodeを使う。hashCodeはハッシュコードというint型の値を返すメソッドである。これらを正しく実装しないクラスのオブジェクトはHashtableなどのキーにすることはできない。
hashCodeはequalsで等しいとされるオブジェクトは同じハッシュコードを戻すようにしなければならない。等しくない場合は任意であるが、異なるハッシュコードにする方が検索等が速くなる。
import java.util.*; class A{ int weight; A(int w){ weight = w; } public boolean equals(Object obj){ if( (obj instanceof A) && weight == ((A)obj).weight ){ return true; }else{ return false; } } public int hashCode(){ return weight % 10; } } class hashtest{ public static void main(String[] args){ Hashtable ht = new Hashtable(); ht.put(new A(3),"hello"); ht.put(new A(5),"world"); System.out.println(ht.get(new A(5))); System.out.println(ht.get(new A(2))); } }
実行結果は次の通り。2に対応するオブジェクトがないので、nullが返ってくる。
world null
0 件のコメント:
コメントを投稿