दिलचस्प पोस्ट
PHP सरणी एकाधिक प्रकार – मूल्य से फिर कुंजी के द्वारा? AngularJS: वादे का प्रयोग कहाँ करना है? एंड्रॉइड में सिस्टम स्क्रीन उर्जा प्रोग्रामेटिक रूप से लागू नहीं किया जा सकता एन के नीचे सभी मूल्यों की सूची का सबसे तेज़ तरीका वीडियो दृश्य प्राप्त करेंड्राइंग कैच काला लौट रहा है एंड्रॉइड: कैसे यूआरएल स्ट्रिंग यूआरआई ऑब्जेक्ट के लिए रिक्त स्थान के साथ पार्स करें? जावा में सत्र प्रबंधन के लिए सर्वश्रेष्ठ विकल्प जावा और एंड्रॉइड डेवलपमेंट में वीक रेफरेंस का उपयोग कैसे करें? जावा में नाम से एक वर्ग को इन्स्तांत करने का कोई तरीका है? जावास्क्रिप्ट में पूर्णांक की श्रेणी पर स्विच करें पता लगाएँ कि डिवाइस आईओएस है मूल्य पर आधारित बहुआयामी-सरणी से तत्व हटाएं केवल जावास्क्रिप्ट का उपयोग कर किसी फ़ोल्डर से सभी छवि फ़ाइल नामों की सूची वापस करने का कोई तरीका है? SQL सर्वर में दी गई तालिका को संदर्भित करने वाली सभी विदेशी कुंजीओं को कैसे सूचीबद्ध कर सकता हूं? हल्लो विषय का उपयोग कैसे करें, और पूर्व-मधुकोश उपकरणों पर 'लाइट' पर वापस आ जाओ?

वैरिएबल का समाधान नहीं किया जा सकता

मैं एक आइटम सूची बनाने की कोशिश कर रहा हूं, प्रत्येक i और j चर के लिए अलग है मेरा कोड है:

if (i == 0) { if (j == 0) { final CharSequence[] items = {"4:45", "5:00"} } else if (j == 1) { final CharSequence[] items = {"4:43", "4:58"} } else if (j == 2) { final CharSequence[] items = {"4:41", "4:56"} } else { final CharSequence[] items = {"4:38", "4:53"} } 

 new AlertDialog.Builder(this) .setTitle("Hours") .setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { // getStation(i); } }) .show(); } 

मुझे लाइन में एक त्रुटि मिलती है। .setItems(items, ,:

 items cannot be resolved 

मुझे लगता है कि कंपाइलर सोचता है कि CharSequence[] items प्रारंभ नहीं हो सकते हैं या कुछ … मैं इस कार्यक्रम को कैसे चला सकता हूं?

वेब के समाधान से एकत्रित समाधान "वैरिएबल का समाधान नहीं किया जा सकता"

समस्या चर scoping है।

 if (someCondition) { final int i = 666; } else { final int i = 42; } int j = i + 1; // compile-time error 

यहां हमारे पास दो लोकल वैरिएबल हैं जो कि वे घोषित और आरम्भ होने के तुरंत बाद गुंजाइश से बाहर निकलते हैं। अगर j के मूल्य की आवश्यकता है, तो i एक बड़े क्षेत्र में घोषित करना होगा।

 final int i; if (someCondition) { i = 666; } else { i = 42; } int j = i + 1; // compiles fine! 

(यह उल्लेख किया जाना चाहिए कि यह वास्तव में परिदृश्यों की तरह है जहां टर्नर ऑपरेटर उत्कृष्टता, यानी)

 final int i = (someCondition) ? 666 : 42; 

आपके विशिष्ट मामले में, दुर्भाग्य से, सरणी प्रारंभिक शॉर्टहैंड केवल घोषणा पर आरंभ करने के लिए उपयोग किया जा सकता है अर्थात्:

 int[] arr1 = { 1, 2, 3 }; // compiles fine! int[] arr2; arr2 = { 4, 5, 6 }; // doesn't compile! 

आप if items बाहर की घोषणा को बाहर खींच सकते हैं और प्रत्येक मामले के लिए वर्बोस कोड लिख सकते हैं (जॉकीम सॉर का जवाब देखें), लेकिन एक अधिक संक्षिप्त कोड सरणी-के- arrays का उपयोग करने के बजाय है

 final CharSequence[][] allItems = { { "4:45", "5:00" }, { "4:43", "4:58" }, { "4:41", "4:56" }, { "4:38", "4:53" } }; final CharSequence[] items = allItems[j]; 

यह तकनीक इस मामले में अच्छी तरह से काम करती है, लेकिन अधिक सामान्य मामले में आप एक Map या कुछ इसी तरह का उपयोग करना चाहते हैं।

नोट: यह मूल कोड में स्पष्ट नहीं है, लेकिन यह काम करता है यदि j या तो 0 , 1 , 2 या 3 यदि आप आखिरी विकल्प को लागू करना चाहते हैं जब j 0 , 1 , 2 अलावा कोई अन्य मूल्य है, तो आपको इसके लिए जांचना होगा और इसे 3 से पहले इस कोड को सेट करना होगा।

आपके पास वास्तव में आपके कोड में 4 items वैरिएबल हैं, प्रत्येक एक बहुत ही सीमित गुंजाइश के साथ (केवल संबंधित के कोड-ब्लॉक)।

इसके बजाय आप एक बड़ा स्कोप के साथ एक वेरिएबल बनाना चाहते हैं:

 if (i == 0) { final CharSequence[] items; if (j == 0) { items = new CharSequence[] {"4:45", "5:00"}; } else if (j == 1) { items = new CharSequence[] {"4:43", "4:58"}; } else if (j == 2) { items = new CharSequence[] {"4:41", "4:56"}; } else { items = new CharSequence[] {"4:38", "4:53"}; } // you can use items here } 

संपादित करें: मैं भूल गया था कि new CharSequence[] यहां जरूरी है। यदि आप घोषणा के दौरान चर को प्रारंभ करते हैं, तो आप इसे छोड़ सकते हैं, लेकिन यहां आपने घोषणा को बाहर कर दिया और एक मान सेट करने के लिए एक साधारण असाइनमेंट का उपयोग किया। किसी कारण के लिए एक सरणी को परिभाषित करने का छोटा सिंटैक्स केवल एक प्रारंभिक वक्तव्य में मान्य है (यानी एक असाइनमेंट में जो घोषणा के रूप में एक ही वक्तव्य में है)।

जावा में आपके पास सख्त ब्लॉक स्तरीय गुंजाइश है, उदाहरण के लिए:

 if (blah) { int foo = 1; } // foo is no longer visible here 

तो एक बार जब आप उस करीबी घुंघराले ब्रेस पर पहुंच जाते हैं) तो आपके आइटम वैरिएबल अब दिखाई नहीं दे रहे हैं। यह जावास्क्रिप्ट से भिन्न है उदाहरण के लिए जहां आपके पास फ़ंक्शन-स्तरीय स्कोप है

उम्मीद है की यह मदद करेगा।

चूंकि आप एक ब्लॉक के भीतर items को परिभाषित (साथ ही एक मूल्य देते हैं), यह केवल उस ब्लॉक के भीतर दिखाई देता है ब्लॉक के बाहर परिभाषा को कहीं न कहीं आप दोनों स्निपेट्स के लिए दिखाई दें, और if else निर्माण के भीतर मूल्य निर्दिष्ट करें

इससे पहले items घोषित करें

 if (i == 0) { 

जिस तरह से आप इसे अब कर रहे हैं, items केवल भीतर के दायरे में ही है if एस।

आप केवल स्थानीय क्षेत्र में आइटम की घोषणा कर रहे हैं आप को स्थानांतरित करने की आवश्यकता है

 final CharSequence[] items 

अगर क्लाजों के बाहर और इसके तहत यदि खंड के अंदर इन्स्तांत होता है