2010-05-20 20 views
8

जब नीचे बयान में की तरह कास्टिंग: -शुरुआती जावा Integer.parseInt के बारे में प्रश्न() और कास्टिंग तो

int randomNumber=(int) (Math.random()*5) 

यह यादृच्छिक कोई कारण बनता है। एक int में परिवर्तित करने के लिए उत्पन्न ..

इसके अलावा यह तरीका है कि मैं अभी Integer.parseInt() में आया हूं जो वही करता है!

यानी एक पूर्णांक

लौट क्यों एक मूल्य के किसी पूर्णांक बनाने के लिए दो अलग अलग तरीकों?

इसके अलावा मैंने एक खोज की और कहा कि parseInt() एक तर्क के रूप में स्ट्रिंग लेता है .. तो क्या इसका मतलब यह है कि parseInt() केवल स्ट्रिंग को पूर्णांक में परिवर्तित करने के लिए है?

इस कास्टिंग के बारे में क्या (int) ?? क्या हम स्ट्रिंग को एक int में बदलने के लिए इसका उपयोग कर सकते हैं?

खेद है यह लग रहा है एक गूंगा question..I की तरह बस उलझन में है और समझने के लिए

मदद की कोशिश कर रहा हूँ?

+1

यह आपकी पारसी समस्याओं का उत्तर नहीं देगा, लेकिन 'java.util.Random' का उपयोग करने पर विचार करें। आप 'रैंडम रैंड = नया रैंडम()' और 'int dieRoll = rand.nextInt (6) +1; '(नोट,' अगला INT' 0 (n-1) लौटा सकता है, यही कारण है कि उस पर अतिरिक्त 1) – corsiKa

+0

@glowcoder: मैं भी उस टिप्पणी को बनाने वाला था। यह आश्चर्य की बात है कि हम अभी भी यह 'Math.random() * एन' गैर-समझ को कितनी बार देखते हैं। – polygenelubricants

+0

इस तरह से पूछताछ के लिए अच्छी तरह से किया गया है, विशेष रूप से बिट के बारे में हम एक int को स्ट्रिंग डालने के लिए (int) का उपयोग कर सकते हैं। – dewd

उत्तर

15

Integer.parseInt एक कलाकार के रूप में एक ही काम नहीं करता है।

के अपने पहले उदाहरण पर एक नज़र डालें:

int randomNumber=(int) (Math.random()*5) 

math.random एक डबल देता है, और जब आप एक पूर्णांक द्वारा एक डबल गुणा जावा परिणाम समझता है एक डबल किया जाना है। इस प्रकार अभिव्यक्ति Math.random() * 5 में एक प्रकार का डबल है। आप जो करने का प्रयास कर रहे हैं वह उस प्रकार को मान int के चर के लिए असाइन किया गया है। डिफ़ॉल्ट रूप से जावा आपको संकलक को स्पष्ट रूप से बताए बिना टाइप int के चर के लिए एक डबल मान असाइन करने की अनुमति नहीं देगा कि ऐसा करना ठीक है। मूल रूप से आप कंपाइलर को बताते हुए एक int को एक int को कास्टिंग करने के बारे में सोच सकते हैं, "मुझे पता है कि यह int वैरिएबल इस डबल मान का दशमलव भाग नहीं रख सकता है, लेकिन यह ठीक है, बस इसे छोटा करें।"

अब किसी पूर्णांक पर एक स्ट्रिंग के रूपांतरण पर एक नज़र डालें:

int value = Integer.parseInt("5"); 

स्ट्रिंग "5" नहीं तुरंत एक पूर्णांक के लिए परिवर्तनीय है। युगल के विपरीत, जिसे परिभाषा द्वारा दशमलव भाग को छोड़कर एक पूर्णांक में परिवर्तित किया जा सकता है, स्ट्रिंग को आसानी से या लगातार int में परिवर्तित नहीं किया जा सकता है।"5", "042", और "1,000" सभी में पूर्णांक प्रतिनिधित्व हैं, लेकिन कुछ "हैलो, वर्ल्ड!" नहीं करता। इस वजह से स्ट्रिंग को एक int में परिवर्तित करने के लिए कोई पहली ऑर्डर भाषा सुविधा नहीं है। इसके बजाय, आप स्ट्रिंग को पार्स करने और मान वापस करने के लिए एक विधि का उपयोग करते हैं।

तो आपके सभी सवालों के जवाब देने:

क्यों दो अलग अलग तरीकों एक मूल्य के किसी पूर्णांक बनाने के लिए?

आपको यह ध्यान रखना होगा कि आप किस प्रकार के मूल्य को परिवर्तित कर रहे हैं। यदि आप एक प्राइमेटिव को int में परिवर्तित कर रहे हैं तो आप एक कास्ट का उपयोग कर सकते हैं, यदि आप ऑब्जेक्ट को परिवर्तित कर रहे हैं तो आपको उस प्रकार के विशिष्ट प्रकार की रूपांतरण विधि का उपयोग करने की आवश्यकता होगी।

इसके अलावा मैंने एक खोज की और कहा कि parseInt() एक तर्क के रूप में स्ट्रिंग लेता है .. तो क्या इसका मतलब यह है कि parseInt() केवल स्ट्रिंग को पूर्णांक में परिवर्तित करने के लिए है?

सही। आप किसी अन्य प्रकार को parseInt विधि में पास नहीं कर सकते हैं या आपको एक कंपाइलर त्रुटि मिल जाएगी।

इस कास्टिंग के बारे में क्या (int) ?? क्या हम स्ट्रिंग को एक int में बदलने के लिए इसका उपयोग कर सकते हैं?

नहीं, int को कास्टिंग केवल आदिम मूल्यों के लिए काम करेगा, और जावा में एक स्ट्रिंग एक आदिम नहीं है।

+0

वाह .. सभी के लिए धन्यवाद! चीजें अब समझ में आती हैं .. मैंने बस parseInt() .. पर एक शब्द को पार करने का प्रयास किया है। यह थ्रेड – Serenity

+1

@happysoul में कुछ अपवाद कहने में त्रुटि दिखाता है! उस विधि के लिए जावाडोक पर एक नज़र डालें: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#parseInt(java.lang.String), ध्यान दें कि यह कहते हैं कि यदि आप जिस स्ट्रिंग में पास करते हैं वह एक पारदर्शी int नहीं है तो यह एक नंबरफॉर्मेट अपवाद फेंक देगा। –

+0

मैंने अभी किया है इस लिंक के लिए – Serenity

4

आपके उदाहरण में, आप एक int के लिए एक फ़्लोटिंग-पॉइंट नंबर कास्टिंग कर रहे हैं। Integer.parseInt(), हालांकि, स्ट्रिंग से एक पूर्णांक मान पढ़ता है।

+0

ओह Math.random() एक डबल उत्पन्न नहीं करता है? – Serenity

+2

डबल और फ्लोट फ्लोटिंग-पॉइंट प्रकार हैं :) –

+0

ओह ठीक है। मैंने इसे केवल – Serenity

1

कास्टिंग केवल एक संख्यात्मक प्रकार से दूसरे में परिवर्तित हो सकता है। एक विधि कॉल के साथ एक स्ट्रिंग (उर्फ पार्सिंग) की व्याख्या करना आवश्यक है।

3

आप केवल संगत प्रकारों के बीच डाले जा सकते हैं (मैं जेएलएस से लिंक करूंगा लेकिन यह शुरुआती प्रश्न के लिए बहुत अधिक हो सकता है)।

कास्टिंग मूल रूप से केवल एक मूल्य ले रहा है और कह रहा है, "अरे, यह बात एक डबल थी? अब यह एक int है। तो वहाँ।"

आप स्ट्रिंग के साथ ऐसा नहीं कर सकते क्योंकि यह int की तरह कुछ नहीं है। आपको इसके बजाय पार्स इसके अंदर से एक int है, जो वास्तव में लगता है कि यह वास्तव में बहुत कठिन है। सौभाग्य से, यह आपके लिए पहले ही लागू हो चुका है, इसलिए आपको चिंता करने की ज़रूरत नहीं है कि यह कैसे काम करता है।

+0

एएच ठीक के रूप में गलत तरीके से पढ़ा है..मैं इसे अभी प्राप्त करता हूं .. धन्यवाद लेकिन हे वास्तव में मैं इन विधि के कोडों को देखने के बारे में सोच रहा था यानी parseInt() और यादृच्छिक() ... मैं बस देखना चाहता था कि वे वास्तव में कैसे काम कर रहे हैं (मुझे पता है कि मैं इसे सब समझ नहीं पाऊंगा लेकिन कम से कम एक विचार प्राप्त करूंगा) .. मुझे इंटीजर और मैथ क्लासेस कहां मिलेंगे? वे मेरे पीसी पर कहां संग्रहीत हैं? – Serenity

+0

ओह और जेएलएस क्या है? – Serenity

+0

@happysoul: आपने जेडीके को कैसे स्थापित किया है, इस पर निर्भर करते हुए, आपके पास सी: \ प्रोग्राम फ़ाइलें \ जावा \\ (आपका जेडीके फ़ोल्डर) में src.zip नामक एक ज़िप फ़ाइल हो सकती है। इसे खोलें और इंटेगर और मैथ को खोजने के लिए जावा \ lang में देखें। वैकल्पिक रूप से, यदि आपके पास एक आईडीई सही तरीके से स्थापित है, तो आप बस उस पर कूदने के लिए विधि नाम पर ctrl + क्लिक कर सकते हैं। –

1

चलिए शीर्ष से शुरू करते हैं।

int randomNumber=(int) (Math.random()*5); 

हां, यह वास्तव में 0 और 4 के बीच एक यादृच्छिक पूर्णांक देता है, लेकिन ऐसा करने का यह उचित तरीका नहीं है। तुम देखो, अगर आप एक कोष्टक भूल जाते हैं, अर्थात आप टाइप

int notSoRandomNumber=(int) Math.random()*5; 

क्योंकि कास्टिंग गुणा से अधिक पूर्वता है आप हमेशा 0 मिलेगा। इसका मतलब यह है कि Math.random() का परिणाम पहले पूर्णांक में घुमाया जाता है, जो हमेशा 0 होगा और फिर यह 5 से गुणा हो जाएगा, जो अभी भी 0 है।

मैं java.util.Random का उपयोग करने का पक्ष लेगा यादृच्छिक पूर्णांक उत्पन्न करने के लिए। q.v. http://java.sun.com/javase/6/docs/api/java/util/Random.html#nextInt(int)

कास्टिंग केवल "संगत प्रकारों" के बीच किया जा सकता है। आदिम प्रकारों और उनके रैपर के लिए (यानी int, Integer, long, Long, & c।) आप हमेशा उन चेतावनियों के साथ डाले जा सकते हैं जो कुछ रूपांतरण जानकारी खो देते हैं। जैसे एक int के लिए लंबे समय तक कास्टिंग करते समय, लंबे समय में Integer.MAX_VALUE से बड़ी संख्या हो सकती है]। जावा का इस प्रकार का कास्टिंग मूल रूप से सी ++ से मिलता है, जो बदले में सी

वस्तुओं कास्टिंग करने के लिए, यह वास्तव में सरल है। बस पूछें "क्या यह वस्तु है, ओ, एक्स?" यदि ऐसा है तो (एक्स) ओ समझ में आता है और स्थिर प्रकार एक्स है। यदि ओ एक्स नहीं है और आप किसी भी तरह कास्ट करने का प्रयास करते हैं, तो आपको क्लासकास्ट अपवाद प्राप्त होगा कि ओ गतिशील (रनटाइम) प्रकार एक्स के साथ संगत नहीं है। यह इच्छा होगी संभवतः जब आप स्थैतिक और गतिशील (रनटाइम) प्रकार के ऑब्जेक्ट्स के बीच अंतर प्राप्त करते हैं तो शायद बहुत अधिक समझ लें।

0

के बाद कोड में परिवर्तित स्ट्रिंग किसी भी तरीकों के बिना int करने के लिए

public class MyStringToNumber { 

    public static int convert_String_To_Number(String numStr){ 

     char ch[] = numStr.toCharArray(); 
     int sum = 0; 
     //get ascii value for zero 
     int zeroAscii = (int)'0'; // '0'=48 zeroAscii=48 
     for(int i=0;i<ch.length;i++){ 
      int tmpAscii = (int)ch[i]; // for 0 ch[i]=3,3=51, tempAscii=51 
             //   (0*10)+(51-48) 
             //   0  +3 
             //   3 
             //  sum=3 
             // for 1 ch[i]=2,2=50, tempAscii=50    
      sum = (sum*10)+(tmpAscii-zeroAscii); // 0 +(51-48)=3 sum=3 
                // (3*10)=30+(50-48) 
                //   30 + 2 
                // sum=32 
             // for 2 ch[i]=5, 5=53 tempAscii=53 
             //   (32*10)+(53-48) 
             //   320 + 5 
             //   325  
             // sum=325 
             // for 3 ch[i]=6,6=54, tempAscii=54 
             //   (325*10)+(54-48) 
             //   3250 +6 
            //   3256 
            // sum=3256 
     } 
     return sum; 
    } 

    public static void main(String a[]){ 

     System.out.println("\"3256\" == "+convert_String_To_Number("3256")); 
    } 
} 

आउटपुट "3256" -> 3256

0
  1. पार्स() विधि उपलब्ध है कई प्रारूपों है, पूर्णांक वर्ग विधि होने ParseInt() जो एक स्थिर विधि है, हम इस विधि को Integer.ParseInt()

  2. इसी प्रकार डबल क्लास परसेडबल() रखते हैं और हम इसे डबल.पर्स कहते हैं eDouble()।

  3. अधिक जेनेरिक रास्ता XXXX.ParseXXXX है()

  4. इस विधि का मुख्य उपयोग एक आदिम में किसी भी वस्तु कन्वर्ट करने के लिए है।

  5. और यहां आप एक सवाल उठा सकते हैं कि हमें Primitives में क्यों परिवर्तित करने की आवश्यकता है? उत्तर है, हम जानते हैं कि प्राइमेटिव्स स्टैक क्षेत्र में संग्रहीत हैं और ऑब्जेक्ट्स हीप क्षेत्र में संग्रहीत हैं, और आप हीप मेमोरी बर्बाद नहीं करना चाहते हैं और आप ऑब्जेक्ट को एक आदिम में परिवर्तित कर सकते हैं।

  6. और दूसरी बात, किसी ऑब्जेक्ट तक पहुंचने पर ओवरहेड हो सकता है। आदिम के रूप में उपयोग करना बेहतर है।

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