2014-12-31 11 views
6

Nesnenin kopyasını kullanmak ve bu kopya için değerleri değiştirmek konusunda sorun yaşıyorum, bunun yerine her iki nesnenin de değerlerini değiştirir. Nesne için kod.Nesnemi kopyalayamıyorum ve değerleri değiştiremiyorum

public class Board { 
    private int[][] board; 

    public Board() { 
     board = new int[9][9]; 
    } 
    public Board(int[][] layout){ 
     board = layout; 
    } 

    public int[][] getBoard(){ 
     return board; 
    } 
    public int getBoardValue(int y, int x){ 
     return board[y][x]; 
    } 
    public void insertValue(int v, int y, int x){ 
     board[y][x] =v; 
    } 
} 

Ve eski hala değiştiren yeni bir nesne değerini 1 eklemeye çalıştığımda Yani

public Board copy(Board b) { 
    Node node = new Node(b); 
    int[][] layout = node.getBoard().getBoard(); 
    Board temp = new Board(layout); 
    temp.insertValue(1,4,5); 
    return temp; 
} 

işe çalışıyorum fonksiyonu için kodu.

+0

derliyor mu? veya başka bir hata mesajı alıyor musunuz? – ochi

cevap

3
public Board(int[][] layout){ 
    board = layout; 
} 

Bu marka tahta ve düzen noktası aynı adresinde gerçekleştirilir. Siz de layout diziyi kopyalamak zorunda

public Board(int[][] layout){ 
    this(); 
    for(int i=0; i<layout.length;i++) 
    for(int j=0; j<layout[0].length;j++) 
     board[i][j] = layout[i][j]; 
} 
+0

@Tom hatam, işaret ettiğin için teşekkürler! – issathink

2

Varolan bir diziye dizi değişkeni atadığınızda, yeni bir dizi elde edemezsiniz. Aynı diziye iki referans alırsınız. Örneğin

:

int[] a = { 1, 2, 3}; 
int[] b = a; 

a ve b iki dizi, aynı diziye iki referans değildir. Ardından, a'un değiştirilmesi, b'un değiştirilmesiyle aynıdır.

2B dizileriyle başka bir yakalama daha vardır: bir dizi int[][] x aslında diğer dizilerin dizisini tutan bir dizidir. Bunun bir naif kopyası (int[][] y = x.clone()), int[] dizilerinin bir dizisine paylaşılan referanslar tutan iki int[][] dizisi verir.

Bir 2B dizisini düzgün kopyalamak için, içindeki 1D dizilerini kopyalamayı gerektirir.

- Senin durumunda

, hem nesneleri aynı dizide başvurular tutun. Bunların ayrı dizilere sahip olmasını istiyorsanız diziyi kopyalamanız gerekir. Böyle kurucusundaki diziyi kopyalayabilirsiniz:

public Board(int[][] layout) { 
    board = new int[layout.length][]; 
    for (int i = 0; i < layout.length; ++i) { 
     board[i] = layout[i].clone(); 
    } 
} 
+0

Bu soruyu sormadım, ama öğrenme amaçlarım için şunu açıklayabilir misiniz: "Her iki nesneniz de aynı diziye referanslar tutun." benim için sorun yoksa? –

+0

@KickButtowski 'int [] []' bir nesne türüdür. OP, "A" örneğinin "board" nesne referansını kullandı ve "B" örneğine iletti. Ancak kurucu, sağlanan 2d dizisini doğrudan "board" örnek değişkenine atar. Bu, düşündüğü gibi bir kopya oluşturmadığı anlamına gelir, her iki örnekte de bunu kullandığı için sadece * paylaşır *. – Tom

+0

Teşekkürler beyler ama kimseyi göremezsiniz. Gördüğüm kadarını görüyorum, ama ne dediğini ve kod snippet'i –

1

: Böyle bir şey deneyin.

public Board copy(Board b) { 
    Node node = new Node(b); 
    int[][] oldLayout = node.getBoard().getBoard(); 
    int[][] newLayout = new int[9][9]; 
    for(int i=0; i<newLayout.length; i++) { 
     newLayout[i] = Arrays.copyOf(oldLayout[i], oldLayout[i].length); 
    } 
    Board temp = new Board(newLayout); 
    temp.insertValue(1,4,5); 
    return temp; 
} 
İlgili konular