java中数组的部分副本

时间:2013-09-05 15:33:52

标签: java arrays

[[-6, 3, 9], [-7, 2, 9], [-3, 2, 5], ... , [3, 4, 1]]

我使用的数组的结构与上面的类似。

我的目标是根据之前确定的某个位置划分这个数组。

我尝试过Arrays.copyOfArrays.copyOfRangeSystem.arraycopy - 但是没有成功,这就是我为此编写自己的方法的原因;它也没用。

partitionResultint类型的实例(变量)数组,其结构与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找到了一个小虫子。

4 个答案:

答案 0 :(得分:1)

错误应该在

 arrayOfVals[begin][j] = partitionResult[begin+i][j];

将其更改为

 arrayOfVals[i][j] = partitionResult[begin+i][j];

因为新创建的数组必须从0开始插入值。

答案 1 :(得分:1)

这应该很简单,你只是通过改变end来让自己变得困难,这使得你很难理解循环的进展。只需复制beginend(包括)之间的值,但请确保克隆每个子数组。 (克隆有效地取代了你的内循环。)

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]