如何裁剪阵列的一部分?

时间:2014-03-05 16:28:55

标签: java arrays reference crop

我有一个主要的2d对象数组,我想裁剪它的一部分。为了清楚起见,我试图引用主数组的一部分并创建一个对应于指定区域的新对象。因此,如果我在裁剪数组中更改某些内容,它也会在主数组中更改。我陷入困境,试图弄清楚数组是否传递对该对象或值的引用。 如果我有一个数组

1,2,3
4,5,6
然后我就能抓住

2,3
5,6

如果我要将其改为

1,1
2,2

看起来像

1,1,1
4,2,2

这是我想要做的简单版本。

3 个答案:

答案 0 :(得分:1)

  

我一直试图弄清楚数组是否传递了对该对象的引用或值。

我不太确定我是否正确理解了你的隐含问题,但是Java数组按值存储它们的元素。这意味着int数组将存储int元素,而Object数组将存储对象的引用,因此如果更改数组元素,您将更改引用“指向”不同对象的引用更改被引用的对象不会导致对数组的任何直接更改。

至于你的例子:

您可以创建一个对象,该对象包含对int[][]数组的引用(也是btw也是对象)以及要覆盖的区域的偏移量和大小。

然后提供setter和getter,它们进行必要的索引计算并访问共享数组,例如像这样的东西:

//note that for simplicity's sake I'll omit a lot of code like constructors etc.
class Region {
  int[][] sharedArray;
  int xOffset;
  int yOffset;
  int width;
  int height;

  public int get(int x, int y) {
    //Note: you should check the array length and offsets to prevent IndexOutOfBoundsExceptions
    return sharedArray[x + xOffset][y + yOffset];
  }

  public set set(int x, int y, int value) {
    //Note: you should check the array length and offsets to prevent IndexOutOfBoundsExceptions
    sharedArray[x + xOffset][y + yOffset] = value;
  }
}

int[][] array = ...;
//define a 10x10 region starting at indices x = 2 and y = 4, e.g. it spans x = [2,11] and y = [4,13]
Region r = new Region(array, 2, 4, 10, 10); 

//retrieve the element at position 5/5 relative to the region
//or (5+2)/(5+4) = 7/9 in the shared array
int element = r.get( 5, 5 ); 

答案 1 :(得分:1)

你可以创建一个提供间接的类,比如CroppedArray。喜欢的东西;

public class CroppedArray {
int[][] theArray;
int x1, y1, x2, y2;

public CroppedArray(int[][] realArray,int x1,int y1,int x2,int y2) {
    theArray = realArray;
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
}
public int getCell(int i, int j) {
    return theArray[x1+i][y1+j];
}
public int setCell(int i, int j, int value) {
    return (theArray[x1+i][y1+j] = value);
}
 }

你会像

一样使用它
CroppedArray section = new CroppedArray(original,2,2,3,3);
 section.setValue(0,0,-1);
 if (original[2][2] != section.getValue(0,0)) { ... err.re  }

答案 2 :(得分:0)

在java中,所有内容都是按值传递的,但是原始类型存储为值,对象存储为引用。如果您尝试对其执行某些操作,则会复制存储的值。

查看每行的评论:

static class MutableInteger {
    public int value;
}

public static void main(String[] args) {
    int[] arraya = new int[3];
    int[] arrayb = arraya; //reference is copied, they both referencing to the same array now
    arrayb[0] = 5;
    int value = arrayb[0]; //arrayb[i] is integer - primitive data type, hence the value is copied
    arrayb[0] = 3; //now arraya[0] and arrayb[0] are equal 3, "int value" is still 5

    MutableInteger[] arrayc = new MutableInteger[3];
    arrayc[0] = new MutableInteger();
    MutableInteger a = arrayc[0]; //MutableInteger is object, therefore is stored as reference in arrayc[0], reference is copied
    a.value = 5; //now the both, arrayc[0].value and "a.value" are equal 5
}