我有一個主要的2D對象數組,我想裁剪它的一部分。要清楚,我試圖引用主數組的一部分,並創建一個對應於指定區域的新對象。所以,如果我改變裁剪數組中的東西,它也會在主數組中改變。我被困在試圖找出數組是否傳遞對該對象或值的引用。 如果我有一個數組如何裁剪數組的一部分?
1,2,3
4,5,6
然後我就能夠抓住
2,3
5,6
如果我是將它更改爲
1,1
2,2
它看起來像
1,1,1
4,2,2
這是t他是我想要做的簡單版本。
我有一個主要的2D對象數組,我想裁剪它的一部分。要清楚,我試圖引用主數組的一部分,並創建一個對應於指定區域的新對象。所以,如果我改變裁剪數組中的東西,它也會在主數組中改變。我被困在試圖找出數組是否傳遞對該對象或值的引用。 如果我有一個數組如何裁剪數組的一部分?
1,2,3
4,5,6
然後我就能夠抓住
2,3
5,6
如果我是將它更改爲
1,1
2,2
它看起來像
1,1,1
4,2,2
這是t他是我想要做的簡單版本。
我被困在試圖找出數組是否傳遞對該對象或值的引用。
我不太清楚我是否正確理解你的隱含問題,但是Java數組通過值來存儲它們的元素。這意味着int
數組將存儲int元素,而Object
數組將存儲對對象的引用,因此如果更改數組元素,則將更改引用以將「指向」指向不同對象,同時更改正在引用的對象不會導致數組的直接更改。
至於你的例子:
您可以創建持有要覆蓋區域到int[][]
數組引用(BTW是一個對象以及)和偏移量和大小的物體。
然後提供setters和getters,它們進行必要的索引計算並訪問共享數組,例如,像這樣:
//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);
因此,因爲我的數組是一個對象數組,它將傳遞該對象的引用而不是該對象內的信息? – user2876613
@ user2876613是數組元素只是引用,對象本身不被複制。 – Thomas
在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
}
你可以創建一個類,說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 }
有你看這裏:http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html – AntonH
會你引用你想裁剪的數組的部分與其維度和索引或其值? – asaini007
Java是**總是**通過價值。你也可以向我們展示你到目前爲止所嘗試過的嗎? – m0skit0