(本文年代久远,请谨慎阅读)看似一个非常简单的问题,但是实际却花了我很多时间。我的目的是,创建一个二维数组str[][],令 str[][] <-- Arraylist<Arraylist<T>>
//此处T指的int(Integer)类型

创建二维数组

首先JAVA中创建二维数组的方法无非两种:

一种是静态的,即已知全部数据,比如要建立3乘3的二维数组,每个数组中的个数,及数组中元素是什么都明确已知,注意,是两者都已知才可以静态赋值,例如

1
int a[][] = {{1,2,6},{3,4,5,6},{7,8,9}} ;

静态赋值比较简单,在实际中用的也不多,因为用到此处时多为不同类型的转化问题,所以大多信息存在于已知的类型数据中,要转化为二维数组中,必然要动态的按照原类型中的信息重构二维数组,所以新的二维数组可能每个数组中元素个数都不确定,需要动态确定。

动态赋值

动态赋值,也分两种,因为赋值方式除了直接两类型相等外,绝大多数都是通过两层循环,逐个赋值。于是产生了问题,在所需要的二维数组的要求“不高”时,可以直接用形如 int [][]a = new int[3][3]; 来存储,反之则会出错误。

上述的“要求”高低,就是说在不确定每个数组长度时,直接用较大的空间去存,就好像 变量 a[] 是一个班的成绩,它是未知的,可以直接用int a[100]来存一样,可能结果只用了100个中的30个,但是也完成了储存或输出的任务。

那么,如果要求是”高”的,意思是,结果二维数组不仅仅完成存储的任务,还要保证每个数组的长度,同原信息保持一致。回到正题,要完成 str[][] <-- Arraylist<Arraylist<T>> 这一过程,用str[1000][1000]来存简单情况下是没有问题的,但二维数组却丢失了ArrayList中的每个“小链表”的长度 这一重要信息。其结果第一是浪费了空间,第二个很重要的是这个二维数组不能再利用,可能通过限制可以完成输出的任务,但是用于递归嵌套等对每个数组长度有明确要求的时候,str[1000][1000]完全没用。

其实,二维数组的每一维都可以动态创建,这一点很重要,动态第一维的方法:int [][]a = new a[第一维数][];

然后,在上面一维创建后,同样可以动态第二维:int a[ i ] = new a[ 第二维数 ];

实现

比如两次循环时,便可以如下操作:

1
2
3
4
5
6
7
8
int [][] arr ;
arr = new int [ 一维数 ][]; //动态创建第一维
for ( i = 0 ; i < 一维数 ; i++ ) {
arr [ i ] = new int [ 二维数 ]; //动态创建第二维
for( j=0 ; j < 二维数 ; j++) {
arr [i][j] = j;
}
}

由上可完成赋值,结果每个数组个数可能都不相同,即完成了Arraylist<Arraylist<T>> 给 str[][] 赋值的工作。