2010-05-14 19 views
22

दोस्तों मैंने जावा पास सरणी सहित संदर्भ में सभी भाषाएं संदर्भित की हैं (संशोधित)जावा सरणी पास काम नहीं करता है?

लेकिन किसी भी तरह से यह यहां काम नहीं करता है। और testArray 3

अजीब पर्याप्त के आकार के साथ अभी भी 1,2,3 है, जब मैं बदल अगर परिणाम [i] = 2 के लिए [1] = एक 2; यह चलेगा । यह संदर्भ

इस कोड के साथ क्या गलत है?

अंत में, मेरे पास एक = परिणाम था; (जो ए अद्यतन)। परिणाम स्टैक से हटा दिया गया। यही कारण है कि अभी भी एक मूल के लिए मिलता है?

मैं उलझन में हूं।

धन्यवाद

class Test 
{ 
    public static void main(String[] args) 
    { 

     int[] testArray = {1,2,3}; 
     equalize(testArray, 6); 

     System.out.println("test Array size :" + testArray.length); 
     for(int i = 0; i < testArray.length; i++) 
     System.out.println(testArray[i]); 
    } 

    public static void equalize(int[] a, int biggerSize) 
    { 
     if(a.length > biggerSize) 
     throw new Error("Array size bigger than biggerSize"); 

     int[] result = new int[biggerSize]; 
    // System.arraycopy(a, 0, result, 0, a.length); 
    // int array default value should be 0 
     for(int i = 0; i < biggerSize; i++) 
     result[i] = 2; 

     a = result; 
    } 
} 
+0

कृपया व्याख्या अपने विवरण में तर्क। क्या आप सरणी आकार का विस्तार करने की कोशिश कर रहे हैं? वर्तमान में आपका परिणाम सरणी मूल सरणी से किसी भी मान की प्रतिलिपि नहीं बनाता है। – Sujee

+0

क्या आपने देखा है? – hejiaming007

उत्तर

6

जावा मूल्य से पास होना जरूरी है। यही कारण है कि आपका कोड काम नहीं करता है। int[] afinal के रूप में चिह्नित करने के लिए एक अच्छा अभ्यास होगा, इसलिए इसके परिणामस्वरूप संकलन त्रुटि होगी (संबंधित Checkstyle rule देखें)।

49

सरणी संदर्भ द्वारा पारित कर दिया है, लेकिन संदर्भ मूल्य द्वारा पारित कर दिया है। यही कारण है कि आप सरणी बदल सकते हैं कि a को संदर्भित करता है, लेकिन आप नहीं बदल सकते हैं जो सरणी a को संदर्भित करता है, है।

2

सरणी a द्वारा संदर्भित संशोधित किया जा सकता है, लेकिन संदर्भ में ही मूल्य से पारित कर दिया है। तो अगर आपने a[0] = 1 किया था, तो आप मूल सरणी बदल रहे होंगे। हालांकि, a = result संदर्भ को बदलता है, और इसलिए मूल संदर्भ अपरिवर्तित है।

+0

क्या मेरे काम को लागू करने के लिए कोई विचार है? मूल रूप से मैं 3 से 6 तक अपने सरणी का आकार बदलना चाहता हूं :( –

5

वापसी पैरामीटर "एक" समारोह और मुख्य कार्य में testArray को असाइन से। जब आप किसी ऑब्जेक्ट को संदर्भ से पास करते हैं, तो संदर्भ की प्रतिलिपि बनाई जाती है और फ़ंक्शन को दी जाती है। तो वस्तु अब 2 संदर्भों द्वारा संदर्भित है। दूसरे संदर्भ के माध्यम से वस्तु में कोई भी परिवर्तन पहले संदर्भ में प्रतिबिंबित होगा, क्योंकि यह दोनों ही संदर्भित एक ही वस्तु है। लेकिन जब आप संदर्भ बदलते हैं (संदर्भ के माध्यम से वस्तु नहीं), यह एक अलग मामला है। आपने दूसरे संदर्भ को दूसरे ऑब्जेक्ट (int [] परिणाम) में बदल दिया है। तो दूसरे संदर्भ के माध्यम से कोई भी परिवर्तन केवल "परिणाम" ऑब्जेक्ट को बदल देगा।

class Test 
{ 
    public static void main(String[] args) 
    { 

     int[] testArray = {1,2,3}; 
     testArray = equalize(testArray, 6); 

     System.out.println("test Array size :" + testArray.length); 
     for(int i = 0; i < testArray.length; i++) 
     System.out.println(testArray[i]); 
    } 

    public static int[] equalize(int[] a, int biggerSize) 
    { 
     if(a.length > biggerSize) 
     throw new Error("Array size bigger than biggerSize"); 

     int[] result = new int[biggerSize]; 
    // System.arraycopy(a, 0, result, 0, a.length); 
    // int array default value should be 0 
     for(int i = 0; i < biggerSize; i++) 
     result[i] = 2; 

     a = result; 
     return a; 
    } 
} 
+0

के लिए देख रहा था, हालांकि यह शून्य है (या कुछ भी वापस नहीं कर रहा है)? धन्यवाद –

+0

नया सरणी फ़ंक्शन के अंदर बनाई गई है। तो यह होना चाहिए लौटाया गया - अनुशंसित दृष्टिकोण। कुछ अन्य दृष्टिकोण हैं जैसे कि परिणाम सरणी को प्रारंभ करना और इसे 3 rd पैरामीटर के रूप में पास करना या 3 पैरामीटर को हैशमैप के रूप में परिभाषित करना और परिणाम सरणी डालना। – Sujee

0

Arrays जावा में ऑब्जेक्ट्स हैं। यदि आपने अपनी सरणी को आकार (वास्तव में लंबाई) के साथ प्रारंभ किया है, तो आप इसे संशोधित नहीं कर सकते हैं। आप एक अलग आकार के साथ एक नया ऐरे बना सकते हैं (जैसा कि आप वर्तमान में फ़ंक्शन में कर रहे हैं) और पुराने ऐरे से सभी मानों को नए ऐरे में कॉपी करें। आपके मामले में, आपके पास 2 ऑब्जेक्ट्स और 3 संदर्भ हैं। यदि आप कॉलिंग फ़ंक्शन में अधिक आकार के ऐरे तक पहुंचना चाहते हैं, तो फ़ंक्शन को अधिक आकार के ऐरे के संदर्भ को वापस कर दें।

4

एक = जब आप कर परिणाम; ऑब्जेक्ट dosnt अब testArray पर इंगित करता है, बीसी आप परिणाम पते का संदर्भ बदल रहे हैं। यही कारण है कि यह अब testArray पर प्रभाव नहीं डालता है। क्या आप वास्तव में क्या कर रहे हैं आप के रूप में परिणाम है एक ही पता कर रहे हैं है, इसलिए जो कुछ भी आप एक में बदल यह परिणाम में भी बदल जाएगा।

आशा इस मदद की ...

0
public class test 
{ 
    public static void main(String[] args){ 
     int[] a = {15, 2, -3}; 
     printArray(a); 
     changeArray(a); 
     printArray(a); 
    } 
    private static void changeArray(int[] a){ 
     for(int i = 0; i < a.length; i++){ 
      a[i]++; 
     } 
    } 

    private static void printArray(int[] a){ 
     for(int i = 0; i < a.length; i++){ 
      System.out.print(a[i] + " "); 
     } 
     System.out.println(); 
    } 
} 

----- आउटपुट -----

15 2 -3

16 3 -2

+4

कुछ प्रकार अगर स्पष्टीकरण हमेशा कोड के साथ जाना अच्छा होता है –

संबंधित मुद्दे