2011年9月4日日曜日

Javaの私的まとめ17

Javaのお勉強その17

  1. コンパレータ

    コレクションや配列を自分が決めた順序でソートしたい場合には、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);
     }
    }
  2. 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引数の指定は必要なくなる。

  3. 反復子

    コレクションの要素の繰り返しを扱うためのインタフェース。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()); // 注目している値を表示して、次を指すようにせよ。
      }
     }
    }
  4. 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 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計