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している。