2014-12-31 8 views
6

मुझे किसी ऑब्जेक्ट की प्रतिलिपि बनाने और उस प्रतिलिपि के मान बदलने के लिए समस्याएं आ रही हैं, इसके बजाय यह मेरी दोनों ऑब्जेक्ट्स के मानों को बदलती है। वस्तु के लिए कोड।मेरी ऑब्जेक्ट की प्रतिलिपि नहीं बना सकते हैं और मूल्यों को बदल सकते हैं

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

और समारोह है कि मैं जब मैं नई वस्तु पुरानी अब भी कोई परिवर्तन में मान 1 सम्मिलित करने के लिए कोशिश तो

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

काम करने के लिए प्राप्त करने की कोशिश कर रहा है के लिए कोड।

+0

यह संकलित करता है? या आपको कोई अन्य त्रुटि संदेश मिलते हैं? – ochi

उत्तर

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

यह कर बोर्ड और लेआउट बिंदु: आप इस तरह निर्माता में सरणी नकल कर सकता है।

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

@ मेरी गलती से, इसे इंगित करने के लिए धन्यवाद! – issathink

2

जब आप किसी मौजूदा सरणी में सरणी चर निर्दिष्ट करते हैं, तो आपको कोई नई सरणी नहीं मिलती है। आपको एक ही सरणी के दो संदर्भ मिलते हैं।

उदाहरण के लिए:

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

a और b दो सरणियों, लेकिन एक ही सरणी के लिए दो संदर्भ नहीं हैं। इसके बाद a बदलना b बदलना जैसा ही है।

2 डी सरणी के साथ एक और पकड़ है: एक सरणी int[][] x वास्तव में एक सरणी है जिसमें अन्य सरणी का अनुक्रम होता है। तो इसकी एक बेवकूफ प्रतिलिपि (int[][] y = x.clone()) आपको int[] सरणी के अनुक्रम में साझा संदर्भ रखने वाले दो int[][] सरणी प्रदान करेगी।

2 डी सरणी की उचित प्रतिलिपि बनाने के लिए इसके अंदर व्यक्तिगत 1 डी सरणी की प्रतिलिपि बनाना आवश्यक है।

-

आपके मामले में, दोनों अपने वस्तुओं एक ही सरणी के लिए संदर्भ पकड़ो। यदि आप चाहते हैं कि उन्हें अलग-अलग सरणी हों तो आपको सरणी की प्रतिलिपि बनाना होगा। एक ही पते पर

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

मैंने इस सवाल से नहीं पूछा, लेकिन मेरे सीखने के उद्देश्यों के लिए आप इसे समझा सकते हैं "आपकी दोनों वस्तुएं एक ही सरणी के संदर्भ रखती हैं।" मेरे लिए अगर आपको कोई फर्क नहीं पड़ता? –

+0

@KickButtowski 'int [] []' एक ऑब्जेक्ट प्रकार है। ओपी ने "ए" के 'बोर्ड' के ऑब्जेक्ट संदर्भ का उपयोग किया और इसे "बी" उदाहरण के लिए पास कर दिया। लेकिन चूंकि कन्स्ट्रक्टर सीधे आवृत्ति चर 'बोर्ड' को प्रदान की गई 2 डी सरणी निर्दिष्ट करता है। इसका मतलब है कि उसने एक प्रतिलिपि बनाई नहीं है जैसा कि उसने सोचा था, वह सिर्फ * साझा * साझा करता है, इसलिए दोनों उदाहरण इसका उपयोग करते हैं। – Tom

+0

धन्यवाद दोस्तों लेकिन क्या कोई भी कोड cuz विच्छेदन कर सकता है मैं इसे नहीं देख सकता। मैं जो कुछ देखता हूं उसे पूरी तरह से प्राप्त करता हूं, लेकिन मैं आपके द्वारा जो कहा गया है उसके बीच कनेक्शन नहीं बना सकता और कोड स्निपेट –

1

आप layout सरणी कॉपी करने के लिए भी है: की तरह कुछ की कोशिश करो।

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; 
} 
संबंधित मुद्दे