我正在定义一个这样的数组:int [][] intervals = new int[10][10];
但是我的数组必须具有不同的维度,具体取决于谁调用定义此数组的函数。
我想尝试执行以下操作:int [][] intervals = new int[][];
但是它说“变量必须提供维度表达式或数组初始化程序”
我也试过int [][] intervals = null
,但之后当我尝试做intervals[3][4] = 10
时,它会给出异常;
那我怎么能做到这一点?
答案 0 :(得分:4)
在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]);
/* ... */
希望这有帮助!
答案 1 :(得分:3)
尝试将多维数组视为数组
它与JVM内部不完全相同,但这是处理这类问题的最佳心理模型。
所以,如果你有
int [][] intervals = null;
然后你的外部数组为空,以后可以用
初始化int size = 10;
intervals = new int[size][];
这会创建一个int[]
数组,但在这种情况下,10个内部数组中的每一个都为空。
如果你想让它们全部大小相同(例如一个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>[]
,它使用数组作为外部集合,以及内部集合的列表。这实际上取决于您的代码需要如何工作。
答案 2 :(得分:1)
如果要动态分配数组中的元素,可能应该考虑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 );