![](/img/trans.png)
[英]Java multidimensional array - Why is only defining the first size enough?
[英]Java defining multidimensional array
我正在这样定义一个数组: int [][] intervals = new int[10][10];
但是我的数组必须具有不同的尺寸,具体取决于谁调用定义此数组的函数。
我想尝试做这样的事情: int [][] intervals = new int[][];
但它说“变量必须提供维表达式或数组初始化器”
我也尝试过int [][] intervals = null
,但是之后,当我尝试执行intervals[3][4] = 10
它给出了异常;
那我该怎么做呢?
在Java中创建多维数组时,必须至少指定最外层数组的维数。 在您的情况下,如果希望所有阵列的大小都不同,则仍然需要指定您需要多少个阵列。 例如,如果您需要六个数组,您可以说
int [][] intervals = new int[6][];
然后,您可以像这样填写它们:
intervals[0] = new int[137];
intervals[1] = new int[42];
/* ... */
如果您事先不知道需要多少个数组,则可能需要考虑使用ArrayList<int[]>
显式添加新数组。 例如:
ArrayList<int[]> intervals = new ArrayList<int[]>();
intervals.add(new int[137]);
intervals.add(new int[42]);
/* ... */
希望这可以帮助!
尝试将多维数组视为数组数组
这与JVM内部的情况并不完全相同,但这是解决此类问题的最佳心理模型。
所以,如果你有
int [][] intervals = null;
那么您的外部数组为null,以后可以使用初始化
int size = 10;
intervals = new int[size][];
这将创建一个int[]
数组,但在这种情况下,10个内部数组中的每一个都是null。
如果希望它们的大小都相同(例如10 x 5阵列),请执行以下操作:
int size1 = 10;
int size2 = 5;
intervals = new int[size1][size2];
但是,如果您希望它们的大小不同,请执行以下操作:
int size = 10;
intervals = new int[size][];
intervals[0] = new int[5];
intervals[1] = new int[4];
// etc...
但是所有这些假设都假定您在开始填充数组之前就知道数组要多大。
如果您不知道,则想使用List
-看一下ArrayList
。
编辑我刚刚在您的评论中看到了后一种情况就是您想要的,所以...
尝试类似:
List< List<Integer> > list = new ArrayList< List<Integer> >();
for(int i=0; i<10; i++) // You would loop over whatever input you're processing
{ // but I don't know what you're doing in that part of you code
// so I'll just do it 10 times.
List<Integer> innerList = new ArrayList< Integer >();
innerList.add( 1 );
innerList.add( 2 );
innerList.add( 3 );
// etc.
list.add( innerList );
}
或者,您可以拥有:
List< int[] >
,这意味着对外部集合使用List,对内部集合使用数组,如果您知道内部集合将要使用多长时间。 List<Integer>[]
,它对外部集合使用数组,对内部集合使用列表。 这实际上取决于您的代码需要如何工作。
如果要动态分配数组中的元素,则应考虑ArrayList :
ArrayList< ArrayList< int > > array = new ArrayList< ArrayList< int > >();
array.add( new ArrayList< int >() );
array.get( 0 ).add( 1 );
array.get( 0 ).add( 2 );
array.add( new ArrayList< int >() );
array.get( 1 ).add( 3 );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.