2013-12-13 16 views
5

नमस्ते प्रिय प्रोग्रामर,जावा ऑपरेटरों का तर्क और & ||

मैं मैं एक सरणी में इस स्ट्रिंग में सभी नंबरों को सहेजना चाहते तो एक स्ट्रिंग String input = "30.09.1993"; है (केवल संख्याओं!)। "।" इंडेक्स 2 और 5 पर हैं इसलिए मैं अपने स्ट्रिंग के इन हिस्सों को अपने लूप में एक if-statement के साथ छोड़ना चाहता हूं।

मैंने अपनी समस्या तय की और सब ठीक काम करता है लेकिन मैं && और || ऑपरेटरों के तर्क से उलझन में हूं।

यह मेरा काम कर कोड है:

String input = "30.09.1993"; 
int[] eachNumbers = new int[8]; 

int x = 0; 
for(int i = 0; i <= 9; i++){ 
    if(i != 2 && i != 5){ 
     eachNumbers[x] = Integer.parseInt(input.substring(i, i+1)); 
     x++; 
    } 
} 

और यह कोड है जो काम नहीं करता है:

String input = "30.09.1993"; 
int[] eachNumbers = new int[8]; 

int x = 0; 
for(int i = 0; i <= 9; i++){ 
    if(i != 2 || i != 5){ 
     eachNumbers[x] = Integer.parseInt(input.substring(i, i+1)); 
     x++; 
    } 
} 

इन दोनों कोड के टुकड़े के बीच फर्क सिर्फ इतना है अगर-खंड में ऑपरेटरों रहे हैं।

मैंने सोचा था कि इन ऑपरेटरों के लिए परिणाम हैं:

&& ऑपरेटर:

false + false = false 
true + false = false 
false + true = false 
true + true = true 

|| ऑपरेटर:

false + false = false 
true + false = true 
false + true = true 
true + true = true 
मेरी राय दूसरा कोड स्निपेट में

तो काम करना चाहिए और पहले फेंक देना चाहिए एक NumberFormatException। लेकिन यह मामला नहीं है।

मुझे यकीन है कि मैं क्या कर रहा हूं इसके लिए कुछ बेहतर समाधान हैं लेकिन मेरा प्रश्न केवल मेरे if-statement में तर्क के बारे में है। क्या कोई मुझे इसके पीछे तर्क बता सकता है? मैं हर मदद उत्तर के लिए पूरी तरह उलझन में हूं और आभारी हूं।

अभिवादन लुकास Warsitz

उत्तर

7

दूसरा टुकड़ा में, अगर-खंड हमेशा की तरह, सच हो जाएगा, क्योंकि i हमेशा नहीं 2 या नहीं 5 (क्योंकि यह 2 और 5 एक ही समय में नहीं किया जा सकता)

हो जाएगा

जो आप अपना पहला स्निपेट करना चाहते हैं वह ठीक है, यह वही करता है जो आप चाहते हैं: यदि आप तीसरे तत्व पर नहीं हैं और न तो 6 वें तत्व पर, आप पार्स करना चाहते हैं, अन्यथा आप बिंदुओं में से एक हैं तारीख में

+0

आपके उत्तर के बारे में थोड़ी देर सोचने के बाद मैंने इसे समझा, तेज़ उत्तर के लिए बहुत बहुत धन्यवाद! –

3

कुंजी यहां मुद्दा यह है:& में & अगर पहला मामला झूठा है, दूसरे मामले की जांच नहीं करेगा।

true && false // Evaluates false because the second is false 
false && true // Evaluates false because the first is false 
true && true // Evaluates true because both are true 
false && false // Evaluates false because the first is false 

और

में || यदि पहला मामला सच है, तो दूसरा मामला जांच नहीं पाएगा।

true || false // Evaluates true because the first is true 
false || true // Evaluates true because the second is true 
true || true // Evaluates true because the first is true 
false || false // Evaluates false because both are false 
+0

"झूठी और झूठी // झूठी मूल्यांकन करता है क्योंकि दोनों झूठे हैं" - सच नहीं है। क्योंकि पहला झूठा है, इसलिए दूसरा एक अवांछित है –

+0

ओह ... हाँ !! अब संपादन देखें। –

1

आपकी दूसरी टुकड़ा काम नहीं कर रहा है क्योंकि यह

if(i != 2 && i != 5) 

होना चाहिए और अपना पहला टुकड़ा एक ही कारण है कि आप & & वहाँ का इस्तेमाल किया है की वजह से त्रुटि फेंक नहीं है।

+0

आपने मुझे सब कुछ बताया जो मुझे पहले पता था .. लेकिन फिर भी धन्यवाद –

3

हालांकि जरूरी नहीं कि आपकी समस्या जो शेरसी नोट करती है।

4 और और या तर्क संचालकों को निम्न तर्क का पालन करें:

& के रूप में आप & & ऊपर का वर्णन है।

false + false = false 
true + false = false 
false + true = false 
true + true = true 

| के रूप में आप || ऊपर

false + false = false 
true + false = true 
false + true = true 
true + true = true 

& & और वर्णन है || शॉर्टकट ऑपरेटर हैं जो दूसरे मान का परीक्षण नहीं करते हैं यदि इससे परिणाम में कोई फर्क नहीं पड़ता है।

& &

false + untested = false 
true + false = false 
false + untested = false 
true + true = true 

||

false + false = false 
true + untested = true 
false + true = true 
true + untested = true 
1

किसी भी संख्या एक संख्या चुनें, । यह या तो बराबर नहीं 2, या नहीं है बराबर 5.

इसलिए अभिव्यक्ति (i != 2 || i != 5) स्थिर (संकलक द्वारा) बस true में तब्दील हो और पूरे if नियंत्रण संरचना का सफाया हो सकता है।

स्पष्ट परिणाम NumberFormatException है यदि अक्षरों में से कोई अंक नहीं है।

1

मैं आपके प्रश्न का उत्तर नहीं दे रहा हूं लेकिन बेहतर कोड सुझा रहा हूं।

public class splitToArray { 
    public static void main(String[] args) { 
     String input = "30.09.1993";  
     input = input.replace(".", " "); 
     String array[] = input.split(" "); 
     for(String value : array){ 
      System.out.println(value); 
     } 
    } 
} 

Output: 
30 
09 
1993 

अब पूर्णांक मान प्राप्त करने के लिए Integer.parseInt का उपयोग करें। यह तब भी काम करेगा जब आपके पास String input = "30.9.1993"; है [से हटाया गया 0]

+0

आपकी सलाह के लिए धन्यवाद लेकिन मुझे जन्मदिन से अंक राशि बनाने की ज़रूरत है, इसलिए मुझे हर एक नंबर की आवश्यकता क्यों है। –

1

i केवल एक समय में एक मूल्य हो सकता है।
तो निम्न स्थितियों में से किसी मान्य हैं:

if(i != 2 && i != 5) //means `i` is not any 2 AND i is not 5 

या

if(i == 2 || i == 5) //means `i` is either 2 OR 5 

नोट: (i != 2 || i != 5) हमेशा क्योंकि किसी भी समय

  1. पर सच है तो मैं = 2, एलएचएस i is not equal to 2 गलत है और आरएचएस i is not equal to 5 सत्य
  2. है
  3. यदि मैं = 5, एलएचएस i is not equal to 2 सत्य है और आरएचएस गलत है
  4. मैं अन्य सभी मूल्यों के लिए: एलएचएस और आरएचएस दोनों सत्य हैं।
+0

"|" के लिए खड़ा नहीं है :) –

+0

@rookieB यह या तो खड़ा है, लेकिन [bitwise OR] (http://stackoverflow.com/a/10142098/2982225), लॉजिकल OR के लिए नहीं;) ध्यान देने के लिए धन्यवाद :) –

+1

अच्छी तरह से मुझे नहीं लगता कि आप बिटवाई का उपयोग कर रहे हैं या जैसा कि मैंने सोचा था कि यह एक टाइपो था –

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