2011-04-11 13 views
27

मुझे जिस परियोजना पर काम कर रहा है, उसके लिए मुझे काफी बड़े 2 आयामी सरणी की एक प्रति बनाने की आवश्यकता है। मेरे पास दो 2 डी arrays हैं:मैं जावा में 2 आयामी सरणी कैसे कॉपी करूं?

int[][]current; 
int[][]old; 

मेरे पास प्रतिलिपि करने के लिए दो विधियां भी हैं। मुझे सरणी की प्रतिलिपि बनाने की आवश्यकता है क्योंकि वर्तमान में नियमित रूप से अपडेट किया जा रहा है।

public void old(){ 
    old=current 
} 

और

public void keepold(){ 
    current=old 
} 

बहरहाल, यह काम नहीं करता। अगर मैं बूढ़ा कहूं, तो वर्तमान पर अपडेट करें, और फिर रखरखाव को कॉल करें, वर्तमान मूल रूप से इसके बराबर नहीं है। यह क्यों होगा?

धन्यवाद

+0

जब आपको खुद को बहु-आयामी सरणी की प्रतिलिपि बनाने की आवश्यकता होती है, तो आपको यह डेटा बेहतर ढंग से प्रबंधित करने के लिए एक नई कक्षा बनाने पर विचार करने का समय मिल सकता है। – corsiKa

+0

क्या यह होमवर्क है? यदि ऐसा है, तो कृपया इसे टैग करें। – jmg

+0

क्या आप जावा में एक आयामी सरणी को कॉपी करने के बारे में जानते हैं? – jmg

उत्तर

29

current=old या old=current दो सरणी एक ही बात का उल्लेख करता है, इसलिए यदि आप बाद में current संशोधित करने, old भी संशोधित किया जाएगा। Arrays.copyOf

+1

धन्यवाद! Arrays.deepEquals (वर्तमान, पुराना) समान रूप से भी काम करेगा? – badcoder

+0

संख्या। क्या Arrays.deepEquals दो सरणी की तुलना कर रहा है और यदि उनकी सामग्री समान हैं तो सत्य वापस आती है। Arrays.copyOf _one-dimensional_ array –

+1

के लिए समान रूप से काम करता है, क्या आप वर्तमान में पुराने को असाइन नहीं कर रहे हैं, न कि – goonerify

0
current = old ; 

असाइनमेंट संचालन एक से दूसरे सरणी के प्रति तत्वों doesnot। आप सिर्फ current मैट्रिक्स बना रहे हैं old मैट्रिक्स का संदर्भ लें। आपको सदस्यवार प्रतिलिपि करने की आवश्यकता है।

+0

धन्यवाद। मैं उसको कैसे करू? – badcoder

0

जावा में Arrays ऑब्जेक्ट्स हैं, और सभी ऑब्जेक्ट्स passed by reference हैं। एक सरणी के लिए एक और नाम बनाने के बजाय वास्तव में "सरणी" प्रतिलिपि बनाने के लिए, आपको एक नया सरणी बनाना होगा और सभी मानों पर प्रतिलिपि बनाना होगा। ध्यान दें कि System.arrayCopy पूरी तरह से 1-आयामी सरणी कॉपी करेगा, लेकिन 2-आयामी सरणी नहीं। कारण यह है कि एक 2 डी सरणी वास्तव में 1 डी सरणी का 1 डी सरणी है, और उसी आंतरिक 1 डी सरणी के लिए पॉइंटर्स पर सरणी कॉपी प्रतियां।

+0

Arrays वस्तुओं नहीं हैं। ऐरे वैरिएबल संदर्भ हैं, ऑब्जेक्ट वेरिएबल्स कैसे संदर्भ हैं, लेकिन वे ऑब्जेक्ट्स नहीं हैं। –

-4

का उपयोग करके एक आयामी सरणी के लिए, आप पाश के लिए अपने स्वयं के बनाने से बच सकते हैं आप नीचे दिए गए दे सकते हैं: एक और सरणी के लिए एक सरणी की सामग्री की नकल करने के लिए, पाश

for(int i=0; i<old.length; i++) 
    for(int j=0; j<old[i].length; j++) 
    old[i][j]=current[i][j]; 

पी एस के लिए उपयोग कोड आज़माएं,

public void multiArrayCopy(int[][] source,int[][] destination){ 
destination=source.clone();} 

आशा है कि यह काम करता है।

+2

राउंड के दूसरे तरीके से नहीं, यह काम नहीं करेगा। चूंकि स्थानीय चर 'गंतव्य' को असाइन करने के लिए' multiArrayCopy' के बाद कोई प्रभाव नहीं पड़ता है। – jmg

5

मैं बहुआयामी पूर्णांक सरणियों कॉपी करने के लिए एक सरल समारोह System.arraycopy

public static void arrayCopy(int[][] aSource, int[][] aDestination) { 
    for (int i = 0; i < aSource.length; i++) { 
     System.arraycopy(aSource[i], 0, aDestination[i], 0, aSource[i].length); 
    } 
} 

या वास्तव में का उपयोग कर लिख इसे हल मैं अपने उपयोग के मामले के लिए के लिए यह सुधार:

/** 
* Clones the provided array 
* 
* @param src 
* @return a new clone of the provided array 
*/ 
public static int[][] cloneArray(int[][] src) { 
    int length = src.length; 
    int[][] target = new int[length][src[0].length]; 
    for (int i = 0; i < length; i++) { 
     System.arraycopy(src[i], 0, target[i], 0, src[i].length); 
    } 
    return target; 
} 
18
/** 
* Clones the provided array 
* 
* @param src 
* @return a new clone of the provided array 
*/ 
public static int[][] cloneArray(int[][] src) { 
    int length = src.length; 
    int[][] target = new int[length][src[0].length]; 
    for (int i = 0; i < length; i++) { 
     System.arraycopy(src[i], 0, target[i], 0, src[i].length); 
    } 
    return target; 
} 

n-dimensio का समर्थन करने के लिए इस कोड को संशोधित करना संभव है ऑब्जेक्ट्स के नाल सरणी?

आप सरणियों की मनमानी लंबाई का समर्थन और देखें कि क्या src और गंतव्य एक ही आयाम के लिए की आवश्यकता होगी और आप भी इस मामले में वस्तु भी एक सरणी था रिकर्सिवली प्रत्येक सरणी के प्रत्येक तत्व नकल करने की आवश्यकता होगी ।

इसके बाद से मैं इस पोस्ट समय हो गया है, लेकिन मैं एक nice example एक ही रास्ता के पाया एक n आयामी सरणी वर्ग बनाने के लिए। वर्ग प्रत्येक आयाम के संबंधित आकार को निर्दिष्ट करते हुए, कन्स्ट्रक्टर में शून्य या अधिक पूर्णांक लेता है। कक्षा अंतर्निहित फ्लैट सरणी Object[] का उपयोग करती है और आयामों और गुणक की सरणी का उपयोग करके प्रत्येक तत्व की अनुक्रमणिका की गणना करती है। (इस प्रकार सी प्रोग्रामिंग भाषा में एरे किए जाते हैं।)

NDimensionalArray का उदाहरण कॉपी करना किसी भी अन्य 2 डी सरणी की प्रतिलिपि बनाना जितना आसान होगा, हालांकि आपको यह कहना होगा कि प्रत्येक NDimensionalArray ऑब्जेक्ट के बराबर आयाम हैं। यह संभवतः ऐसा करने का सबसे आसान तरीका है, क्योंकि कोई रिकर्सन नहीं है, और यह प्रतिनिधित्व और अधिक सरल बनाता है।

0
public static byte[][] arrayCopy(byte[][] arr){ 
    if(arr!=null){ 
     int[][] arrCopy = new int[arr.length][] ; 
     System.arraycopy(arr, 0, arrCopy, 0, arr.length); 
     return arrCopy; 
    }else { return new int[][]{};} 
} 
+1

मैं शब्दों के लिए एक नुकसान में हूँ। यहां आप जाएं: http://ideone.com/4q5MBv – user314104

0

तुम भी इस प्रकार कर सकते हैं:

public static int[][] copy(int[][] src) { 
    int[][] dst = new int[src.length][]; 
    for (int i = 0; i < src.length; i++) { 
     dst[i] = Arrays.copyOf(src[i], src[i].length); 
    } 
    return dst; 
} 
0

मैं इस समारोह का उपयोग कर रहा:

public static int[][] copy(final int[][] array) { 
    if (array != null) { 
     final int[][] copy = new int[array.length][]; 

     for (int i = 0; i < array.length; i++) { 
      final int[] row = array[i]; 

      copy[i] = new int[row.length]; 
      System.arraycopy(row, 0, copy[i], 0, row.length); 
     } 

     return copy; 
    } 

    return null; 
} 

इस दृष्टिकोण का बड़ा लाभ है कि यह भी सरणियों कॉपी कर सकते हैं कि डॉन ' टी की समान पंक्ति गणना नहीं है जैसे:

final int[][] array = new int[][] { { 5, 3, 6 }, { 1 } }; 
0

यहां लूप का उपयोग करके आप इसे कैसे कर सकते हैं।

public static int[][] makeCopy(int[][] array){ 
    b=new int[array.length][]; 

    for(int row=0; row<array.length; ++row){ 
     b[row]=new int[array[row].length]; 
     for(int col=0; col<b[row].length; ++col){ 
      b[row][col]=array[row][col]; 
     } 
    } 
    return b; 
} 
संबंधित मुद्दे