2014-03-05 99 views
3

我有一個主要的2D對象數組,我想裁剪它的一部分。要清楚,我試圖引用主數組的一部分,並創建一個對應於指定區域的新對象。所以,如果我改變裁剪數組中的東西,它也會在主數組中改變。我被困在試圖找出數組是否傳遞對該對象或值的引用。 如果我有一個數組如何裁剪數組的一部分?

1,2,3 
4,5,6 

然後我就能夠抓住

2,3 
5,6 

如果我是將它更改爲

1,1 
2,2 

它看起來像

1,1,1 
4,2,2 

這是t他是我想要做的簡單版本。

+1

有你看這裏:http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html – AntonH

+0

會你引用你想裁剪的數組的部分與其維度和索引或其值? – asaini007

+1

Java是**總是**通過價值。你也可以向我們展示你到目前爲止所嘗試過的嗎? – m0skit0

回答

1

我被困在試圖找出數組是否傳遞對該對象或值的引用。

我不太清楚我是否正確理解你的隱含問題,但是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); 
+0

因此,因爲我的數組是一個對象數組,它將傳遞該對象的引用而不是該對象內的信息? – user2876613

+0

@ user2876613是數組元素只是引用,對象本身不被複制。 – Thomas

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 
} 
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 }