[[-6, 3, 9], [-7, 2, 9], [-3, 2, 5], ... , [3, 4, 1]]
我使用的数组的结构与上面的类似。
我的目标是根据之前确定的某个位置划分这个数组。
我尝试过Arrays.copyOf
,Arrays.copyOfRange
和System.arraycopy
- 但是没有成功,这就是我为此编写自己的方法的原因;它也没用。
partitionResult
是int
类型的实例(变量)数组,其结构与arrayOfVals
arrayOfVals
似乎已使用整个partitionResult
数组初始化,尽管我打算只复制一部分。我已经测试了System.out.println (partitionResult[begin+i][j])
,并且打印的值是所希望的。
private int[][] copyArray(int begin, int end)
{
int SUBARRAY_SIZE = 2;
// below the '+1' is due to zero-indexing
int[][] arrayOfVals = new int[end-begin+1][SUBARRAY_SIZE+1];
end -= begin;
for (int i = 0; i <= end; i++) {
for (int j = 0; j <= SUBARRAY_SIZE; j++) {
arrayOfVals[begin][j] = partitionResult[begin+i][j];
}
}
return arrayOfVals;
}
为什么我不能按照要求做以下事情?
private void foo(int begin)
{
int[][] arrayOne = copyArray(0, begin);
int[][] arrayTwo = copyArray(begin+1, partitionResult.length -1);
...
}
修改 的
[[-6, 3, 9], [-7, 2, 9], [-3, 2, 5], [3, 4, 1], [0, 5, 5], [2, 3, 1], [3, 4, 1]]
这是我的测试数组。
我想在定义的位置copyArray
使用begin
方法拆分此数组。
当我打印我要复制的值partitionResult[begin+i][j]
时,结果完全一样;但是,显示最终arrayOfVals
- 输出不是我打印的,它是整个partitionResult
数组。
我希望arrayOne
等于[[-6, 3, 9], [-7, 2, 9], [-3, 2, 5]]
和arrayTwo
等于[[3, 4, 1], [0, 5, 5], [2, 3, 1], [3, 4, 1]]
编辑2: 问题不在于方法copyArray
,而在于另一种方法。
我写的toString
方法是显示实例变量partitionResult
使用的值,而不是我传递给它的数组 - 这使得它看起来好像没有被复制。这个错误对我来说应该是显而易见的。我非常感谢你的建议。
尽管@Andrea找到了一个小虫子。
答案 0 :(得分:1)
错误应该在
中 arrayOfVals[begin][j] = partitionResult[begin+i][j];
将其更改为
arrayOfVals[i][j] = partitionResult[begin+i][j];
因为新创建的数组必须从0开始插入值。
答案 1 :(得分:1)
这应该很简单,你只是通过改变end
来让自己变得困难,这使得你很难理解循环的进展。只需复制begin
和end
(包括)之间的值,但请确保克隆每个子数组。 (克隆有效地取代了你的内循环。)
private int[][] copyArray(int begin, int end) {
// Calculate the size of the output
// below the '+1' is due to zero-indexing
int size = end - begin + 1;
int[][] arrayOfVals = new int[size][];
for (int i = 0; i < size; i++) {
// Clone each subarray to make sure changes to the copy
// don't affect the internal array
// (A shallow .clone() suffices for integer arrays)
arrayOfVals[i] = partitionResult[begin + i].clone();
}
return arrayOfVals;
}
这会在调用foo(2)
时为您的示例输入提供预期输出。
答案 2 :(得分:0)
如果fromArray是输入数组,索引是你想要打破输入数组的索引,你可以这样做:
System.arraycopy(fromArray, 0, arrayOne, 0, index);
System.arraycopy(fromArray, index+1, arrayTwo, 0, fromArray.length-index);
答案 3 :(得分:0)
创建二维数组时,您所拥有的是一个数组数组。看看这样的问题:
[0,0] [1,0] [2,0] ... [n,0]
[0,1] [1,1] [2,1] ... [n,1]
[0,2] [1,2] [2,2] ... [n,2]
[[ - 6,3,9],[ - 7,2,9],[ - 3,2,5],......,[3,4,1]]
我们可以按如下方式表示您的示例数据集:
[-6] [-7] [-3] ... [ 3]
[ 3] [ 2] [ 2] ... [ 4]
[ 9] [ 9] [ 5] ... [ 1]