2009-04-06 12 views
5

इस कोड में, मेरी सरणी क्यों शुरू नहीं हुई है जैसा मैं चाहता हूं? क्या प्रत्येक लूप को ऐसा करने के लिए डिज़ाइन नहीं किया गया है, या क्या मैं इसे सही तरीके से उपयोग नहीं कर रहा हूं?यह प्रत्येक लूप के लिए क्यों नहीं है?

int[] array = new int[5]; 

    //initialise array -> Doesn't work! Array still full of 0's 
    for(int i : array) 
     i = 24; 
+0

अन्य प्रश्न डुप्लिकेट नहीं होना चाहिए? यह पहला था। – masher

उत्तर

14

प्रत्येक लूप इस मामले के लिए काम नहीं करेगा। आप सरणी को प्रारंभ करने के लिए प्रत्येक लूप के लिए उपयोग नहीं कर सकते हैं। आपका कोड:

int[] array = new int[5]; 
for (int i : array) { 
    i = 24; 
} 

निम्नलिखित की तरह कुछ करने के लिए अनुवाद कर देगा:

int[] array = new int[5]; 
for (int j = 0; j < array.length; j++) { 
    int i = array[j]; 
    i = 24; 
} 

यदि यह ऑब्जेक्ट की श्रृंखला थे, यह अभी भी विफल हो जाएगा। असल में, प्रत्येक-प्रत्येक संग्रह को आपके द्वारा प्रदान किए जाने वाले चर के लिए, संग्रह या सरणी में प्रत्येक प्रविष्टि को आवंटित करता है, जिसके बाद आप काम कर सकते हैं। परिवर्तनीय एक सरणी संदर्भ के बराबर है। यह सिर्फ एक चर है।

के लिए-प्रत्येक, प्रारंभ करने में किसी भी सरणी या संग्रह नहीं किया जा सकता क्योंकि यह सरणी या संग्रह की वर्तमान सामग्री पर लूप होता है, आप प्रत्येक मूल्य एक समय में एक दे रही है। प्रत्येक के लिए चर किसी सरणी या संग्रह संदर्भ के लिए प्रॉक्सी नहीं है। कंपाइलर "array[index]" के साथ आपके "i" ("int i" से) को प्रतिस्थापित नहीं करता है।

आप दिनांक की एक सरणी, उदाहरण के लिए है, और यह, कोड का प्रयास करें:

Date[] array = new Date[5]; 
for (Date d : array) { 
    d = new Date(); 
} 

कुछ इस तरह करने के लिए अनुवाद किया जाएगा: जो

Date[] array = new Date[5]; 
for (int i = 0; i < array.length; i++) { 
    Date d = array[i]; 
    d = new Date(); 
} 

के रूप में आप देख सकते हैं होगा सरणी शुरू नहीं करें। आप सभी नल युक्त एक सरणी के साथ खत्म हो जाएगा।

नोट: मैंने उपरोक्त कोड लिया, इसे .class फ़ाइल में संकलित किया, और उसके बाद इसे jad का उपयोग करने के लिए उपयोग किया। यह प्रक्रिया मुझे सूर्य जावा कंपाइलर द्वारा उत्पन्न निम्न कोड देता है (1।6) उपरोक्त कोड से:

int array[] = new int[5]; 
int ai[]; 
int k = (ai = array).length; 
for(int j = 0; j < k; j++) 
{ 
    int i = ai[j]; 
    i = 5; 
} 
+0

असल में, क्या यह एक इटरेटर के साथ थोड़ी देर के लूप में अनुवाद नहीं करता है? –

+0

मैं सटीक अनुवाद देने की कोशिश नहीं कर रहा हूं, लेकिन यह महसूस करता है कि यह क्यों काम नहीं करता है। – Eddie

+0

समझ में आता है। चीयर्स। – masher

3

पूर्णांक प्रणाली में एक आदिम प्रकार है, तो आप वास्तव में सरणी में सेल का मान की एक प्रति हो रही है, बल्कि सरणी है कि आप में निर्धारित कर सकते हैं कि सेल के लिए एक संदर्भ से ....

मुझे इसे आज़माएं और समझाएं। यदि आपके पास एक्सएस की एक सरणी थी, जहां एक्स एक वर्ग है जिसमें डेटा सदस्य हैं, तो आपको प्रत्येक पुनरावृत्ति में एक अलग सेल का संदर्भ मिल जाएगा, और इसके कार्यों को कॉल करके अपने राज्य को बदलने में सक्षम होंगे (उदाहरण के लिए, सेटवैल्यू) ।

जब आपके पास इन्ट्स होता है तो यह एक अलग कहानी है, आपका int संदर्भ नहीं है, यह एक वास्तविक प्रकार है क्योंकि यह एक आदिम प्रकार है, इसलिए प्रत्येक पुनरावृत्ति में, प्रतिलिपि को सरणी से एक मान में प्रतिलिपि बनाता है। । फिर आप अपना अपडेट करें, लेकिन इसका सरणी पर कोई प्रभाव नहीं पड़ता है।

+0

हालांकि, विफलता के लिए यह बिल्कुल सही कारण नहीं है। इसके साथ प्राचीन होने के साथ कुछ भी नहीं है। आप * प्रत्येक * सरणी को प्रारंभ करने के लिए प्रत्येक के लिए उपयोग नहीं कर सकते हैं, इससे कोई फर्क नहीं पड़ता कि इसकी सामग्री आदिम है या नहीं। – Eddie

+0

जब तक आपकी कक्षा में एक स्पष्ट सेट वैल्यू() नहीं था जिसे आप कॉल करना चाहते थे। – Uri

+0

यदि आप ऑब्जेक्ट्स की सरणी का उपयोग करते हैं, तो यह कोड सरणी को प्रारंभ नहीं करेगा। यहां चरम के साथ आदिम होने के लिए इसका कोई लेना-देना नहीं है। – Eddie

5

i सरणी में उस बिंदु पर int की एक प्रति है, इसका संदर्भ नहीं है। प्रत्येक लूप के लिए इस मामले में काम नहीं करता है।

0

इस बजाय कार्य करें:

int[] array = new int[5]; 

// initialise array -> Will work now 
for(int i = 0 ; i< array.length ; i++) 
    array[i] = 24 ; 
+0

मैं हर बार उन सभी को लिखना नहीं चाहता था। ऐसा लगता है कि मैं इससे दूर नहीं जा सकता .. :( – masher

+0

प्रोग्रामर के जीवन के दोहराव वाले टाइपिंग पहलू में आपका स्वागत है – euphoria83

4

उपयोग

java.util.Arrays.fill(array, 24)

यदि आप एक ही करने के लिए आरंभ करने जा रहे हैं मूल्य। इसके अलावा, प्रत्येक निर्माण के लिए उनके अनुवाद में एडी बहुत अधिक जगह है।

+0

अच्छा! मैं उस कक्षा का उपयोग अब से बहुत कुछ करने जा रहा हूं! – masher

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