关于JAVA中动态创建二维数组的“技巧”

        看似一个非常简单的问题,但是实际却花了我很多时间。

        我的目的是,创建一个二维数组str[][],令str[][]   <--  Arraylist<Arraylist<T>>;   //此处T指的int(Integer)类型

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

        一种是静态的,即已知全部数据,比如要建立3乘3的二维数组,每个数组中的个数,及数组中元素是什么都明确已知,注意,是两者都已知才可以静态赋值,例如 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[ 第二维数 ];

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

          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[][]  赋值的工作


        我的目的是,创建一个二维数组str[][],令str[][]   <--  Arraylist<Arraylist<T>>;   //此处T指的int(Integer)类型

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

        一种是静态的,即已知全部数据,比如要建立3乘3的二维数组,每个数组中的个数,及数组中元素是什么都明确已知,注意,是两者都已知才可以静态赋值,例如 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[ 第二维数 ];

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

          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[][]  赋值的工作


猜你喜欢

转载自blog.csdn.net/u012935646/article/details/39478371