« 選択範囲をGistに保存するBookmarklet(再掲) | メイン | iPhone/iPod touch向けトラックアップ地図の機能拡充 »

【添削求む】Javaで多次元を扱えるArrayListっぽいクラスを作ってみた

Javaは配列なら多次元を扱えるけど、ArrayListを使った場合は多次元を扱う方法がない模様。
定番のライブラリがありそうだけど自作してみた。
package com.kanasansoft.MultidimensionalArrayLists;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MultidimensionalArrayLists<E>{

    private static final long serialVersionUID=1L;
    private int[] indexes_=null;
    private E data_=null;
    private ArrayList<MultidimensionalArrayLists<E>> children_=new ArrayList<MultidimensionalArrayLists<E>>(); 

    public MultidimensionalArrayLists(int... indexes){
        if(indexes.length==0){
            return;
        }
        if(indexes[0]<0){
            throw new IllegalArgumentException();
        }
        int[] childIndexes=Arrays.copyOfRange(indexes,1,indexes.length);
        ArrayList<MultidimensionalArrayLists<E>> children = new ArrayList<MultidimensionalArrayLists<E>>();
        for(int i=0;i<indexes[0];i++){
            children.add(new MultidimensionalArrayLists<E>(childIndexes));
        }
        this.indexes_=indexes;
        this.children_=children;
    }

    public MultidimensionalArrayLists(List<E> arrayList,int... indexes){
        if(indexes.length==0){
            this.data_=arrayList.get(0);
            return;
        }
        if(indexes[0]<0){
            throw new IllegalArgumentException();
        }
        int length=1;
        for(int i=0;i<indexes.length;i++){
            length*=indexes[i];
        }
        if(arrayList.size()!=length){
            throw new IllegalArgumentException();
        }
        int[] childIndexes=Arrays.copyOfRange(indexes,1,indexes.length);
        ArrayList<MultidimensionalArrayLists<E>> children = new ArrayList<MultidimensionalArrayLists<E>>();
        for(int i=0;i<indexes[0];i++){
            List<E> childrenArrayList = arrayList.subList(length/indexes[0]*i,length/indexes[0]*(i+1));
            children.add(new MultidimensionalArrayLists<E>(childrenArrayList,childIndexes));
        }
        this.indexes_=indexes;
        this.children_=children;
    }

    public void put(E value,int... indexes){
        if(this.indexes_==null&&indexes.length==0){
            this.data_=value;
            return;
        }
        if(this.indexes_.length!=indexes.length){
            throw new IllegalArgumentException();
        }
        int length=this.indexes_.length;
        for(int i=0;i<length;i++){
            if(this.indexes_[i]<=indexes[i]){
                throw new IndexOutOfBoundsException();
            }
        }
        int[] childIndexes=Arrays.copyOfRange(indexes,1,indexes.length);
        this.children_.get(indexes[0]).put(value,childIndexes);
    }

    public E get(int... indexes){
        if(this.indexes_==null&&indexes.length==0){
            return this.data_;
        }
        if(this.indexes_.length!=indexes.length){
            throw new IllegalArgumentException();
        }
        int length=this.indexes_.length;
        for(int i=0;i<length;i++){
            if(this.indexes_[i]<=indexes[i]){
                throw new IndexOutOfBoundsException();
            }
        }
        int[] childIndexes=Arrays.copyOfRange(indexes,1,indexes.length);
        return this.children_.get(indexes[0]).get(childIndexes);
    }

    public int[] getIndexes(){
        int length=this.indexes_.length;
        int[] indexes=new int[length];
        for(int i=0;i<length;i++){
            indexes[i]=this.indexes_[i];
        }
        return indexes;
    }

    public ArrayList<E> getFlatten(){
        ArrayList<E> arrayList=new ArrayList<E>();
        if(this.indexes_.length==1){
            for(int i=0;i<this.indexes_[0];i++){
                arrayList.add(this.children_.get(i).get());
            }
        }else{
            for(int i=0;i<this.indexes_[0];i++){
                arrayList.addAll(this.children_.get(i).getFlatten());
            }
        }
        return arrayList;
    }

}
使い方は以下の通り。
package com.kanasansoft.MultidimensionalArrayLists;

import java.util.ArrayList;

public class Sample {

    public static void main(String[] args) {
        new Sample();
    }
    public Sample(){
        body();
    }
    public void body(){

        MultidimensionalArrayLists<String> mlists = null;
        mlists=new MultidimensionalArrayLists<String>(10,10,10);
        System.out.println(mlists.get(0,0,0));          //=>null
        System.out.println(mlists.getIndexes().length); //=>3
        System.out.println(mlists.getFlatten().size()); //=>1000

        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("x");
        arrayList.add("y");
        arrayList.add("z");
        mlists=new MultidimensionalArrayLists<String>(arrayList,2,3);
        System.out.println(mlists.get(0,0)); //=>"a"
        System.out.println(mlists.get(0,2)); //=>"c"
        System.out.println(mlists.get(1,2)); //=>"z"
        mlists.put("foo", 1,2);
        System.out.println(mlists.get(1,2)); //=>"foo"

    }
}
Java初心者が作ったわりには使い物になるんじゃないかと思う。
変なところや改善案があれば指摘してい欲しい。

コードはGistsにもUploadしている。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド