2011-06-22 9 views
6

किसी ने मुझसे पूछा: जावा में एक सरणी में पूर्णांक और फ्लोट हो सकते हैं? उसे एक शिक्षक से वह सवाल मिला।क्या किसी सरणी में पूर्णांक हो सकते हैं और

अब मेरा जवाब था: हाँ, क्योंकि आप वस्तुओं की एक सरणी घोषित कर सकते हैं और इसमें पूर्णांक और फ्लोट स्टोर कर सकते हैं।

लेकिन अब मैं सोच रहा हूं कि यह सही है, तकनीकी रूप से जब आप एक सरणी में इंटीजर और फ़्लोट ऑब्जेक्ट्स स्टोर करते हैं, तो इसमें दोनों प्रकार होते हैं, लेकिन यदि आप सरणी से "पूछेंगे" तो वह आपको बताएगा ऑब्जेक्ट्स हैं, और यदि मैं बहीखाता या कक्षा की जांच नहीं करता हूं तो यह बताने का कोई तरीका नहीं है कि सरणी में पूर्णांक और फ़्लोट हैं।

दूसरी तरफ मुझे लगता है कि यह सही जवाब हो सकता है क्योंकि सैद्धांतिक रूप से सरणी में दोनों प्रकार की वस्तुएं होती हैं।

तो मैं एक स्मार्ट राय मांग रहा हूं: यदि आपको पूछा गया था (एक साक्षात्कार में, एक परीक्षण जो कुछ भी) जावा में गीला होता है तो एक सरणी में पूर्णांक और फ्लोट हो सकते हैं, हां या नहीं? आप क्या जवाब देंगे?

+2

मेरा जवाब हाँ हो जाएगा, और आप इसे खूबसूरती से समझाने। –

उत्तर

15

intfloatObject[] सरणी में फिट नहीं है। हालांकि, ऑटोबॉक्सिंग जावा द्वारा Float या Integer इसके बजाय सरणी में डाल दिया जाएगा।

Float और IntegerNumber का विस्तार करें। तो अगर आप भी संख्या Number[]

भी की एक सरणी बना सकते हैं, तो आप एक float[] में एक int रख सकते हैं, लेकिन जावा तो एक नाव में पूर्णांक डाली जाएगी। दूसरी तरफ भी संभव है, लेकिन सटीकता खो जाएगी। (संपादित करें: यहां तक ​​कि int-> फ्लोट परिशुद्धता भी खो जा सकती है। फ्लोट-> int मूल्य की समग्र परिमाण के बारे में जानकारी खो सकता है)।

निष्कर्ष इस सवाल पर निर्भर करेगा। आदिम डेटाटाइप के लिए एक सरणी में अन्य डेटाटाइप नहीं हो सकता है। यदि आप ऑब्जेक्ट सरणी (इंटीजर, फ्लोट, संख्या) का उपयोग करते हैं तो उत्तर हाँ होगा।

+5

कड़ाई से आपसे बात कर रहे ** ** ** 'int' को' float [] 'में नहीं डाल सकता है। 'फ्लोट []' में संग्रहीत मान ** हमेशा ** 'फ्लोट' मान हैं। इसके अलावा: 'int' से 'float' में कनवर्ट करना हमेशा लापरवाही नहीं होता है। –

+0

आपके उत्तर के लिए धन्यवाद, लेकिन अभी स्पष्ट होना: अपने निष्कर्ष 'हां' हो सकता है? – Samuel

+0

मेरा निष्कर्ष 'हां लेकिन' होगा। यह दृढ़ता से इस बात पर निर्भर करता है कि सवाल कैसे पूछा गया था। जब आप एक आदिम का उपयोग करते हैं तो इसमें अन्य प्रकार नहीं हो सकता है, आप इसे दूसरे प्रकार से नहीं प्राप्त कर सकते हैं, लेकिन आप दूसरे प्रकार को इसमें डाल सकते हैं। तो जवाब का सख्ती से कल्पना करना आदिम डेटाटाइप के लिए नहीं है। ऑब्जेक्ट्स (इंटीजर, फ्लोट, नंबर) के लिए उत्तर हाँ होगा। – Dorus

1

आप एक आदिम सरणी का उपयोग करना चाहते हैं, तो आप एक double[]double के रूप में उपयोग के लिए सभी संभव int और float मान संग्रहीत कर सकते कर सकते हैं। केवल जानकारी खो कि क्या संख्या मूल रूप से एक int या एक float था

एक डबल []

double[] d = 
int i = 
float f = 
d[0] = i; 
d[1] = f; 

प्राप्त करने के लिए में एक int या float संग्रहीत करने के लिए (वहाँ 33 लाख पूर्णांक है जो या तो हो सकता है कर रहे हैं) एक int या float मूल्य।

int i = (int) d[0]; 
float f = (float) d[1]; 

आप पूर्णांक और फ्लोट सहित वस्तुओं के किसी भी संयोजन स्टोर करने के लिए एक वस्तु [] का उपयोग करते हैं।

साक्षात्कार प्रश्न साक्षात्कारकर्ताओं को उन प्रश्नों के बारे में पूछकर देख सकते हैं जिनके बारे में उन्होंने कभी सोचा नहीं है, आमतौर पर क्योंकि ऐसा करने का कोई अच्छा कारण नहीं था (संभवतः कभी) यदि प्रश्न अजीब लगता है, तो शायद यह चाहिए। ;)

+0

लेकिन अगर मैं संख्याओं को युगल की सरणी में संग्रहीत करता हूं, तो सरणी में केवल फ़्लोटिंग पॉइंट नंबर होंगे, है ना? :) – Samuel

+0

@ सैमुएल, 'int',' float' और 'double' डेटा के सभी बिट हैं। आप उन्हें जो भी चाहें उसका मतलब बना सकते हैं। ;) 'Int' प्राप्त करने के लिए आप 'फ्लोट' प्राप्त करने के लिए '(int) सरणी [n]' कर सकते हैं, आप '(फ्लोट) सरणी कर सकते हैं [n]' –

+1

मैं पूरी तरह से सहमत हूं कि वास्तव में यह सब दो नीचे आता है लोगों और शून्य का गुच्छा, लेकिन मुझे लगता है कि वे उच्च स्तर की प्रस्तुति पर लक्ष्य रखते हैं: पी – Samuel

0

जावा में केवल दो डेटा प्रकार हैं - ऑब्जेक्ट्स (क्लास ऑब्जेक्ट जो विस्तारित करता है) और प्राइमेटिव्स (इंट, बाइट, चार और इतने पर)। इसके अलावा, प्रत्येक आदिम के पास अपनी वस्तु भाई है - उदाहरण के लिए int और java.lang।पूर्णांक

तकनीकी तौर पर, सरणी केवल वस्तुओं हो सकते हैं।

लेकिन जावा 5.0 में यह करने के लिए आदिम-टू-वस्तु रूपांतरण धन्यवाद छोड़ने के लिए 'autoboxing' कार्यों संभव है - मूल रूप से यह
array[0] = new Integer(myInt);

यह प्रतिस्थापन स्वचालित रूप से किया जाता है के साथ
int myInt = 0; array[0] = myInt;
तरह प्रत्येक कॉल की जगह है, लेकिन आंतरिक रूप से (रनटाइम में) जावा मशीन में ऑब्जेक्ट्स (इंटीजर) के साथ सरणी होगी, न कि primitives (int) के साथ, और यह सरणी संचालन के प्रदर्शन को प्रभावित कर सकता है।

2

यह एक सवाल एक स्पष्ट "हाँ" या "नहीं" जवाब है कि नहीं है।

मैं तीन अलग तरीकों से सवाल सकारात्मक जवाब दिया जा सकता देख सकते हैं:

  1. सरणी प्रकार Number[] का हो सकता है और (संदर्भ के लिए) Float और Integer वस्तुओं को शामिल कर सकता है;
  2. सरणी प्रकार double[] का हो सकता है और float और int रों double को कास्ट (N.B. दोनों डाले दोषरहित कर रहे हैं) हो सकता है;
  3. सरणी प्रकार int[] का हो सकता है और int रों संग्रहीत कर सकती है के रूप में के रूप में और float रों intFloat.floatToRawIntBits उपयोग करने के लिए बदल दिया।

मामले में 3 (और तर्कसंगत रूप से 2 मामले में) आपको एक समानांतर सरणी की भी आवश्यकता होगी जो मुख्य सरणी के प्रत्येक तत्व में संग्रहीत मान के प्रकार को रिकॉर्ड करेगी। प्रश्न में निर्मित धारणाओं के आधार पर, यह उपयुक्त उत्तरों के रूप में इन्हें अयोग्य घोषित कर सकता है।

इस सवाल का एक साक्षात्कार में स्थापित करने में आया है, मैं साक्षात्कारकर्ता को संभावनाओं की रूपरेखा तैयार करें और पूछें जो तीन व्याख्याओं की, यदि कोई हो, वे देख रहे थे होगा। यदि आवश्यक हो, तो मैं आगे विस्तारित करूंगा।

+0

2) फ्लोट करने के लिए int भी लापरवाही है। 2 + 3) आप जानकारी खो देते हैं कि मूल मूल्य एक int या एक फ्लोट था। अगर 3 में यह जानकारी भी बहुत महत्वपूर्ण थी। स्मार्ट राय के लिए अभी भी +1। – Dorus

+0

@ डोरस: बहुत अच्छी बात फिर से जानकारी, धन्यवाद। मैंने जवाब अपडेट कर लिया है। सीधे 'int'->' फ्लोट 'टाइप कास्ट के रूप में, यह हानिकारक है क्योंकि' फ्लोट 'में केवल मंटिसा के लिए 23 बिट हैं जबकि' int 'को 31 बिट्स की आवश्यकता हो सकती है। – NPE

+0

सच है, मैं चौड़ाई प्राथमिक रूपांतरण को पढ़ने में तेज़ी से था। फ्लोट करने के लिए int int intes के लिए फ्लोट की तरह सटीकता खो देता है। – Dorus

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