2010-04-12 15 views
18

सबसे पहले, मैं जावा के लिए बिल्कुल नया हूं, इसलिए क्षमा करें यदि यह प्रश्न पूरी तरह से सरल है।मैं कैसे जांचूं कि एक चर प्रारंभ किया गया है

बात यह है: मेरे पास एक स्ट्रिंग को विभाजित करके String[] s है जिसमें प्रत्येक आइटम एक संख्या है। मैं s के आइटम int[] n में डालना चाहता हूं।

s[0] में n आइटमों की संख्या शामिल है, प्रभावी ढंग से s.length-1। मैं इस एक foreach पाश का उपयोग कर ऐसा करने के लिए कोशिश कर रहा हूँ:

int[] n; 
for(String num: s){ 
    //if(n is not initialized){ 
     n = new int[(int) num]; 
     continue; 
    } 
    n[n.length] = (int) num; 
} 

अब, मुझे लगता है कि मैं कुछ इस तरह इस्तेमाल कर सकते हैं:

int[] n = new int[(int) s[0]]; 
for(int i=1; i < s.length; i++){ 
    n[i-1] = (int) s[i]; 
} 

लेकिन मुझे यकीन है कि मुझे लगता है कि के साथ सामना किया जाएगा हूँ "अगर एन प्रारंभ नहीं किया गया है तो इसे आरंभ करें" भविष्य में समस्या।

+0

यदि एस [0] "प्रभावी रूप से एस। लम्बाई -1" है, तो इसे बिल्कुल क्यों शामिल करें? क्यों न सिर्फ लंबाई का प्रतिनिधित्व करते हैं? – CPerkins

+0

मैं सहमत हूं, लेकिन उस इनपुट पर कोई नियंत्रण नहीं है। :) –

उत्तर

13

आप एक int करने के लिए एक String डाली नहीं कर सकता। जावा दृढ़ता से टाइप किया गया है, और कोई निहित प्रकार रूपांतरण नहीं है जैसे आपको एक स्क्रिप्टिंग भाषा में मिल सकता है।

String को int पर कनवर्ट करने के लिए, Integer.parseInt(String) जैसे एक स्पष्ट रूपांतरण का उपयोग करें।

सभी सदस्य चर और सरणी के तत्व डिफ़ॉल्ट मान के साथ आरंभ किए जाते हैं। int प्रकारों के लिए, मान 0 है। संदर्भ प्रकारों के लिए (Object का कोई उप प्रकार), डिफ़ॉल्ट मान null है। स्थानीय चर को डिफ़ॉल्ट मान नहीं मिलता है, लेकिन संकलक यह सुनिश्चित करने के लिए कोड का विश्लेषण करता है कि चर को पढ़ने से पहले एक मान असाइन किया गया है। यदि नहीं, तो कोड संकलित नहीं होगा।

मुझे लगता है कि क्या आप चाहते हैं कुछ इस तरह है:

int[] n = new int[Integer.parseInt(s[0]); 
for (int idx = 0; idx < n; ++idx) 
    n[idx] = Integer.parseInt(s[idx + 1]); 
+0

संदर्भ प्रकारों के बारे में हिस्सा "संदर्भ प्रकार (ऑब्जेक्ट का कोई * उप प्रकार * होना चाहिए" होना चाहिए, क्योंकि 'ऑब्जेक्ट []' ऑब्जेक्ट' का उप-वर्ग नहीं है, लेकिन यह एक उप प्रकार है। –

+0

धन्यवाद, इसके साथ थोड़ा सा खेलने के बाद मुझे पता चला कि मुझे इसे कास्ट करने के लिए नया इंटीजर करना था। –

+2

@ जेवियर: फिर से: यह "कास्टिंग" नहीं है, जो "रूपांतरित" है। –

1

आपके द्वारा उनका उपयोग null से पहले करने के लिए अपने चर या वस्तुओं को प्रारंभ करते हैं, तो

String myVar1 = null; 
Person bobby = null; 

आप चर या नल नहीं करने के लिए वस्तु की तुलना कर सकता है,

if (myVar != null) { 
    // myVar has a value. 
} 
+1

केवल तभी जब इसे शुरू में और स्पष्ट रूप से शून्य के लिए प्रारंभ किया गया था या यह एक ऑब्जेक्ट/क्लास सदस्य – Yaneeve

+0

है, मैंने अपना जवाब संपादित किया था, मुझे अपनी दिशा के साथ और अधिक स्पष्ट होना चाहिए था। –

0

आप null के लिए जाँच कर सकते हैं:

int[] n; 
for(String num: s){ 
    if(n == null) { 
     n = new int[(int) num]; 
    } 
    n[n.length] = (int) num; 
} 

ध्यान दें कि यह केवल हा अगर एन वर्ग वर्ग है तो पेंशन। यदि यह एक स्थानीय चर है, तो संकलक इसे आरंभ किए बिना इसके साथ कुछ भी करने नहीं देगा।

+3

यह संकलित नहीं होगा: स्थानीय चर * डिफ़ॉल्ट * डिफ़ॉल्ट रूप से 'null' पर सेट नहीं हैं। (इसके अतिरिक्त इंटेल-कास्टिंग के साथ समस्या है जो @erickson के रूप में काम नहीं करेगा)। –

2
int[] n = null; 
for(String num: s){ 
    if(n == null){ 
     n = new int[(int) num]; 
     continue; 
    } 
    n[n.length] = (int) num; 
} 
+0

धन्यवाद। मुझे नहीं पता था कि मैं किसी भी प्रकार के चर के लिए शून्य निर्दिष्ट कर सकता हूं। –

+0

@ जेवियर: केवल संदर्भ प्रकारों के चर/फ़ील्ड के लिए। तो सबकुछ 'int', 'बूलियन', 'char',' short',' long', 'float',' double'। संदर्भ प्रकारों में 'इंटीजर',' int [] ', और अन्य संभावनाओं की एक अनंत संख्या शामिल है। स्पष्टीकरण के लिए – polygenelubricants

+0

@ पोलिजेनेलब्रिकेंट्स धन्यवाद, तो यह मूल प्रकार के अलावा सब कुछ है, है ना? –

12

आप की जाँच नहीं कर सकते हैं एक चर अपने कोड में आरंभ नहीं हो जाता है, क्योंकि एक चर कि प्रारंभ कर दिया गया है नहीं हो सकता है से परिभाषा पढ़ने से एक संकलन-समय त्रुटि की ओर जाता है।

आप null चर को प्रारंभ और कहा कि मूल्य के लिए जाँच करता है, तो अपने चर एक आदिम प्रकार औरnull आरंभीकरण के बाद कोई मान्य मान नहीं है नहीं है सकते हैं।

विशिष्ट उदाहरण में आपके द्वारा दिखाया गया दूसरा कोड निश्चित रूप से क्लीनर होगा।

1

केवल यह है कि आप null के खिलाफ जांच है एक उचित अच्छा विकल्प है। यदि आपका कोड किसी विधि के भीतर है, तो यदि आप प्रारंभ नहीं करते हैं तो यह संकलित नहीं होगा। तो यदि यह संकलित और चलाता है तो आप जानते हैं कि इसे कम से कम null पर प्रारंभ किया गया है और फिर null जांच कर रहा है।

1

जैसा कि अन्य ने ध्यान दिया है, ऐसा करने के लिए "सही तरीके" की सबसे नज़दीकी चीज सरणी को शून्य में प्रारंभ करना है।

अन्य बिंदुओं पर:

"n [n.length]" एक "अनुक्रमणिका सीमा से बाहर" अपवाद फेंक देते हैं। Arrays में 0 से लंबाई -1 तक के तत्व होते हैं। किसी भी मामले में, मुझे लगता है कि आप पहले मामले में क्या कहना चाहते थे "एन [0]" और दूसरे में "एन [i]" था।

पहले तत्व में किसी सरणी के आकार को संग्रहीत करना शायद एक बुरा विचार है। यह एक int सरणी के लिए किया जा सकता है, लेकिन यह एक स्ट्रिंग सरणी में गन्दा होगा और यह एक बुलियन सरणी के लिए बिल्कुल काम नहीं करेगा। यहां तक ​​कि इंट केस में, अब आप एक ही डेटा स्ट्रक्चर में दो बहुत ही अलग चीजों को मिला रहे हैं, जो भ्रमित होने की संभावना है। यदि सरणी का आकार तय किया गया है, तो "लंबाई" आकार को वैसे भी रखता है। यदि सरणी आकार परिवर्तनीय है और आप सोच रहे हैं कि आप पर्याप्त रूप से एक सरणी बनाने जा रहे हैं और फिर वास्तव में उपयोग की जाने वाली राशि को संग्रहीत करने के लिए, आप ArrayList का उपयोग करना बेहतर कर रहे हैं, जो गतिशील आकार के सरणी को साफ-सुथरा करता है।

+0

आपके उत्तर के लिए धन्यवाद। हाँ, मैं एनएल लम्बाई हमेशा x लौट रहा था, मुझे जावा के कार्यान्वयन की लंबाई को समझ में नहीं आया, अब मैं इसे देखता हूं, यह बहुत समझ में आता है, इसके बाद मैंने इसे एक्स तत्वों के साथ शुरू किया, इसलिए एन। लम्बाई चाहिए हमेशा एक्स वापस आओ। और हाँ मैं सहमत हूं, पहले तत्व में आकार संग्रह करना गन्दा है, लेकिन मेरा उस पर कोई नियंत्रण नहीं है (मैं कुछ अभ्यास कोड कर रहा हूं, और यह अपेक्षित इनपुट है) –

+0

आह, गैर-संवेदी आवश्यकताओं फिर से गैर-संवेदी डिजाइन । मुझे कॉलेज में ली गई एक अर्थशास्त्र कक्षा के बारे में याद दिलाता है। पाठ्यपुस्तक में एक अध्याय ने सनकी लागतों के बारे में बात की और इस बात को इंगित किया कि भविष्य की योजनाओं के लिए सनकी लागत अप्रासंगिक है। अध्याय के अंत में एक अभ्यास था जिसमें कहा गया था, "मान लीजिए कि आपको नौकरी मिलती है और आपका मालिक कहता है, 'मुझे परवाह नहीं है कि उन्होंने आपको अर्थशास्त्र वर्ग में क्या बताया है! मैं चाहता हूं कि आप हमारी सभी धूप की लागत में कारक हों या आप 'निकाल दिया गया!' क्या सनकी लागत अब आपके लिए अप्रासंगिक हैं? " – Jay

0

मैं इस समस्या में भाग गया, यह जांच कर रहा हूं कि int प्रारंभ किया गया है या नहीं। मेरे कार्यक्रम में, यह संभव था कि इसे 0 में शुरू किया गया था, इसलिए if (int i = 0) जांचना बहुत अच्छा नहीं होगा।

एक समाधान/कार्य-आसपास के रूप में, मैंने boolean वैरिएबल बनाया जो int प्रारंभ होने पर सेट किया गया है। उम्मीद है की यह मदद करेगा।

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

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