北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

ArrayListとperlの配列の違い 三夜目

Listインタフェースの実装はめんどかったので辞めます。Eclipseの"Generate Delegate Method"コマンドを使う手もありますが、その後の修正を考えるとやっぱりめんどい。

で、代わりにAbstractListを使ってみます。こいつは、オレみたいなめんどくさがり屋のために20のメソッドを実装してくれてます。残るはget(), size(), set(), add(), remove()の5つだけ。これを実装すれば望みのクラスが完成ですヽ(‘ ∇‘ )ノ。

import java.util.List;
import java.util.ArrayList;
import java.util.AbstractList;

class PerlLikeList<E> extends AbstractList<E> {
    private List<E> innerList = null;


    public PerlLikeList() {
        this(new ArrayList<E>());
    }


    public PerlLikeList(List<E> l){
        this.innerList = l;
    }


    public int size() {
        return innerList.size();
    }


    public E get(int index) {
	// 添字の正規化
        if(index < 0) index += this.size();
	// 範囲外はnull
	if(index < 0 || index >= this.size()) return null;
        return innerList.get(index);
    }


    public void add(int index, E element) {
        // 添字の正規化。-1 が末尾の次になるようにする。
        if(index < 0) index += this.size() + 1;

	if(index < 0){
	    // 追加したい場所が不明
	    throw new IndexOutOfBoundsException();
	}

        if(index > this.size()){
	    // 足りない分を穴埋め
            int num = index - this.size();
            for(int i = 0; i < num; i++){
                this.add(null);
            }
        }

        innerList.add(index, element);
	return;
    }



    public E remove(int index) {
	// 添字の正規化
        if(index < 0) index += this.size();
	// 範囲外はnull
	if(index < 0 || index >= this.size()) return null;
        return innerList.remove(index);
    }


    public E set(int index, E element) {
	// 削除して追加する
        E original = this.remove(index);
        this.add(index, element);
        return original;
    }


}

set()の実装をremove()とadd()を利用してサボってます。


innerList.メソッド()が出て来る部分が、委譲してる部分です。異常値だけ正規化したりトラップして、後はinnerListに丸投げさせてます。