2012-06-14 96 views
5

मैं अपने आप जावा सीख रहा हूं; और इसलिए नीचे दिए गए कोड में सीखने/परीक्षण के अलावा कोई कार्य नहीं है।जावा फोरैच में संशोधित तत्व

अनिवार्य रूप से मैं एक फ़ोरैच लूप में एक इंटीजर सरणी (अर्थात् उन्हें रोकना) के तत्वों को संशोधित करने का प्रयास कर रहा हूं।

मुझे ध्यान रखना चाहिए कि मैं तत्वों को पुन: क्रमबद्ध, जोड़ या हटा नहीं रहा हूं; बस अपने मूल्यों को बदल रहा है।

[47, 31, 71, 76, 78, 94, 66, 47, 73, 21] 

और copyArray के उत्पादन में है:

[47, 31, 71, 76, 78] 

इसलिए हालांकि

Logger.describe("Now copying half of that array in to a new array, and halving each element"); 
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE/2];  
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE/2); 
for (Integer x : copyArray) x /= 2; 
Logger.output(Arrays.deepToString(copyArray)); 

हालांकि, मूल सरणी (intArray) यह है:

यहाँ मेरी कोड है सरणी आकार में आधा हो गया है, तत्वों (इंटेगर्स) को मूल्य में भी कम नहीं किया गया है। तो मैं क्या गलत हूं?

धन्यवाद

+1

मुझे लगता है कि इस autoboxing से कोई लेना देना नहीं है, इसलिए जब आप 'कर एक्स/2', यह वस्तु के मूल्य को संशोधित नहीं है, लेकिन स्वचालित रूप से इसे एक प्राचीन 'int' में परिवर्तित करता है और इसे विभाजित करता है, इसलिए आपका' इंटीजर 'उदाहरण प्रभावित नहीं होता है। – maksimov

+0

तो क्या/= ऑपरेटर केवल 'int' मान प्रकारों पर लागू होता है, न कि इंटीग्रर्स, जिससे 'x' चर को int में परिवर्तित किया जा सकता है? – Xenoprimate

+0

अनिवार्य रूप से 'x = x/2' एक 'x = नया इंटीजर (x.intValue()/2)' है। इसलिए चूंकि आप इसे सरणी में वापस नहीं जोड़ रहे हैं, इसलिए आप अपने सरणी तत्वों को संशोधित नहीं कर रहे हैं। – maksimov

उत्तर

13

आप इसे फ़ोरैच लूप में नहीं कर सकते हैं।

for (int i=0; i<copyArray.length;i++) 
    copyArray[i] /= 2; 

अन्यथा आप इसे सरणी में वापस असाइन नहीं कर रहे हैं। Integer ऑब्जेक्ट्स इस तरह से अपरिवर्तनीय हैं, इसलिए उन्हें संशोधित नहीं कर सकते हैं (हालांकि नए बनाते हैं)।

टिप्पणी से अपडेट किया गया: खबरदार हालांकि वहाँ पर इसके कुछ कारण हैं कि, autoboxing/उदाहरण के लिए unboxing, मोटे तौर पर:

copyArray[i] = Integer.valueOf(copyArray[i].intValue()/2); 
+0

उनकी अपरिवर्तनीयता को ध्यान में रखते हुए, इसका मतलब है कि यह इंटीजर ऑब्जेक्ट को सरणी में एक नए से बदल देगा? – Xenoprimate

+0

सही। इस मामले में ऑटोबॉक्सिंग/अनबॉक्सिंग भी चल रही है। तो भी simliar: 'copyArray [i] = Integer.valueOf (copyArray [i] .intValue()/2); ' –

+0

तो int इंटीजर सिर्फ int के लिए ऑब्जेक्ट रैपर है? वास्तविक उपनाम नहीं (जैसे सी # में)? – Xenoprimate

1
for (int i = 0; i< copyArray.length; i++) { 
    copyArray[i] = new Integer(x /2); 
} 

काम करना चाहिए।

1
int counter = 0; 
for(int x : copyArray) 
{ 
     x /= 2; 
     copyArray[counter++] = x; 
} 

आपका कार्यक्रम सिर्फ चर x का मूल्य संशोधित, नहीं सरणी के ब्लॉक के भीतर मान copyArray

0

मुझे लगता है कि आप एरे के तत्वों को संशोधित करने के लिए फ़ोरैच लूप निर्माण का उपयोग नहीं कर सकते हैं। इसके बजाय, आप तो जैसे पाश के लिए एक क्लासिक उपयोग करने की आवश्यकता:

Logger.describe("Now copying half of that array in to a new array, and halving each element"); 
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE/2];  
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE/2); 
    for (int i = 0; i < copyArray.length; i++) { 
     copyArray[i] /= 2; 
    } 
Logger.output(Arrays.deepToString(copyArray)); 
+1

सामान्य रूप से, आप तत्वों को संशोधित कर सकते हैं (यदि वे उत्परिवर्तनीय हैं), वास्तविक समस्या यह है कि इंटीग्रर्स अपरिवर्तनीय हैं ... – Mainguy