我有一个主要的2d对象数组,我想裁剪它的一部分。为了清楚起见,我试图引用主数组的一部分并创建一个对应于指定区域的新对象。因此,如果我在裁剪数组中更改某些内容,它也会在主数组中更改。我陷入困境,试图弄清楚数组是否传递对该对象或值的引用。 如果我有一个数组
1,2,3
4,5,6
然后我就能抓住
2,3
5,6
如果我要将其改为
1,1
2,2
看起来像
1,1,1
4,2,2
这是我想要做的简单版本。
答案 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
}