Java:声明多维数组而不指定数组大小(例如,new int [10] [])

8

我一直在试图弄清楚这里到底发生了什么。我只是想弄清楚下面我评论的那两行代码在做什么。我找到了一个程序,它没有声明数组的完整维度(而是使用“new int[10] [];”来表示未声明)。好像第二个数组长度并不重要(将其更改为1或100不会影响输出)。

int[][] tri = new int[10][];  //this lack of giving the size of the 2nd array is strange
 for (int r=0; r<tri.length; r++) {
 tri[r] = new int[r+1];   //I'm not sure what this line is doing really 
}
for (int r=0; r<tri.length; r++) {
 for (int a=0; a<tri[r].length; a++) {
     System.out.print(tri[r][a]);  
     }
 System.out.println();
 }
6个回答

12

第一行创建了一个int数组的数组。有10个槽位被创建用于存放int数组。

第三行创建了一个新的int数组并将其放入最初创建的某个槽位中。新的int数组中有r+1个int空间。

因此,位置0上的int数组将有1个int槽位。位置1上的int数组将有2个int槽位。总体的形状将是:

[
    [0],
    [0,0],
    [0,0,0],
    ...,
    [0,0,0,0,0,0,0,0,0,0]
]

变量名 tri(它看起来像一个三角形)暗示了这一点


1
很抱歉,我的上一条评论不完整,我无法删除它。所以似乎第一个数组长度必须始终声明,但在此之后,数组长度的长度可以即时创建?(例如,new int [10] [];是可以的,因为它有第一个长度声明)。另外,'tri[r] = new int [r + 1];' 这行代码似乎创建了数组的第二部分,但是否可能使这个数组比第一个数组更大(当我这样做时,会产生异常)? - Tony DiNitto
1
你总共有11个数组。第一个数组是其他10个数组的数组。new int [10] []表示“创建一个可以容纳'int []'对象的数组,并为它们分配10个插槽。”你代码片段的第三行表示“创建一个具有'r + 1'插槽的int数组,并将新数组放入已存在的插槽'r'中。”你可以随意调整这11个数组的大小,所有11个大小都是独立的。 - Riley Lark

5

new int[10][]表示声明一个大小为10的数组,其中包含null数组。

for循环中,null数组会被实例化成逐渐增加的数组大小。


3

如果你将多维数组看作是数组的数组,那么这就更有意义了:

int [][] tri = new int[10][]; // This is an array of 10 arrays

tri[r] = new int[r+1]; // This is setting the r'th array to
                       // a new array of r+1 ints

3

这只是声明了一个由10个数组组成的数组。每个“子”数组的长度都可以不同。


0

它并不缺少,基本上没有设置特定数量,因为它可以有许多字段,所以这并不是必需的

第二行

tri[r] = new int[r+1];

将所有字段设置为非空


0

在Java中使用多维集合更好。

语法:

ArrayList <Object> x= new ArrayList <Object>();

以下是Java中多维集合的应用。


import java.util.*; 

class MultidimensionalArrayList { 

    /*function for creating and returning 2D ArrayList*/
    static List create2DArrayList() 
    { 
        /*Declaring 2D ArrayList*/
        ArrayList<ArrayList<Integer> > x 
            = new ArrayList<ArrayList<Integer> >(); 

        /*one space allocated for 0th row*/
        x.add(new ArrayList<Integer>()); 

        /*Adding 3 to 0th row created above x(0, 0)*/
        x.get(0).add(0, 3); 

        /*Creating 1st row and adding values 
    (another way for adding values in 2D collections)*/
        x.add(new ArrayList<Integer>(Arrays.asList(3, 4, 6))); 

        /*Add 366 to 1st row 0th column x(1, 0)*/
        x.get(1).add(0, 366); 

        /*Add 576 to 1st row 4th column x(1, 4)*/
        x.get(1).add(4, 576); 

        /*Adding values to 2nd row*/
        x.add(2, new ArrayList<>(Arrays.asList(3, 84))); 

        /*Adding values to 3rd row*/
        x.add(new ArrayList<Integer>(Arrays.asList(83, 6684, 776))); 

        /*Adding values to 4th row*/
        x.add(new ArrayList<>(Arrays.asList(8))); 

        return x; 
    } 

    public static void main(String args[]) 
    { 
        System.out.println("2D ArrayList :"); 

        /*Printing 2D ArrayList*/
        System.out.println(create2DArrayList()); 
    } 
} 



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接