2011-07-28 12 views
10

संभव डुप्लिकेट:
If/Else vs. Switchबेहतर: स्विच-केस या अगर-और?

मैं यहाँ दो कोड, मैं सिर्फ पूछने के लिए, जिनमें से दो writability के मामले में बेहतर है (कोड लिखने की आसानी) चाहता था है और में पठनीयता की शर्तें (कोड को समझने में आसानी)।

स्विच मामला:

import java.io.*; 

public class Quarter{ 
    public static void main(String[] args){ 
     int day; 
     String input=""; 

     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

     System.out.print("Input a number from 1 to 3: "); 

     try{ 
      input=in.readLine(); 
     }catch(IOException e){ 
      System.out.println("Error!"); 
     } 
     day=Integer.parseInt(input); 

     switch(day){ 
      case 1: 
      case 2: 
      case 3: 
       System.out.println("1st Quarter"); 
       break; 
      case 4: 
      case 5: 
      case 6: 
       System.out.println("2nd Quarter"); 
       break; 
      case 7: 
      case 8: 
      case 9: 
      System.out.println("3rd Quarter"); 
      break; 
      case 10: 
      case 11: 
      case 12: 
       System.out.println("4th Quarter"); 
       break; 
      default: System.out.println("Error!"); 
     } 

    } 
} 

अगर-बाकी:

import java.io.*; 

public class Days{ 
    public static void main(String[] args){ 
     int day; 
     String input=""; 

     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

     System.out.print("Input a number from 1 to 12: "); 

     try{ 
      input=in.readLine(); 
     }catch(IOException e){ 
      System.out.println("Error!"); 
     } 
     day=Integer.parseInt(input); 

     if(day>=1 && day<=3){ 
      System.out.println("1st Quarter"); 
     }else 
     if(day>=4 && day<=6){ 
      System.out.println("2nd Quarter"); 
     }else 
     if(day>=7 && day<=9){ 
      System.out.println("3rd Quarter"); 
     }else 
     if(day>=10 && day<=12){ 
      System.out.println("4th Quarter"); 
     }else 
      System.out.println("Error!"); 
    } 
} 
+0

नहीं काफी है कि के रूप में एक नकली सी # के लिए है और यह जावा तो जावा खोजकर्ताओं मूल – Mark

+0

मैं पूछ काफी कुछ सवालों पर गौर किया नहीं मिल रहा होता है एक ही बात, लेकिन एक अलग भाषा के लिए। हो सकता है कि किसी को एक समुदाय विकी प्रश्न बनाना चाहिए, और एक उत्तर है जो प्रत्येक भाषा के लिए प्रश्न को कवर करता है? – Wipqozn

उत्तर

36

न तो, मैं इस एक कार्य करें चाहते हैं:

String[] out = { 
    "1st Quarter", 
    "2nd Quarter", 
    "3rd Quarter", 
    "4th Quarter" 
}; 

if (1 <= day && day <= 12) { 
    System.out.println(out[(day - 1)/3]); 
} else { 
    System.out.println("Error!"); 
} 
+2

मैं मानता हूं, ऐसा करना 'if' या' switch' ब्लॉक का उपयोग करने से बहुत साफ है। – fireshadow52

+4

4 डिब्बे में डालने के लिए 12 महीने हैं, इसलिए हमें 3. –

+7

से विभाजित करना चाहिए, हालांकि मैं इसे बेहतर बनाने के लिए इस उत्तर का समर्थन करता हूं: System.out.println ((दिन> 0 और दिन <13)? बाहर [(दिन -1)/3]: "त्रुटि!"); – emory

3

कौन सा तुम करोगी पसंद करते हैं? यह आपका कोड है।

मैं निश्चित रूप से स्विच-केस पसंद करता हूं, लेकिन यदि आपके पास कुछ संयुक्त है या उदा। स्विच-केस से अधिक 'ऐसा करने का सही तरीका नहीं है।

एक और बात: मैं, निम्नलिखित की तरह स्विच मामले लिखते थे क्योंकि मुझे लगता है कि यह बेहतर है पढ़ने के लिए:

switch(day){ 
    case 1: 
    case 2: 
    case 3: 
     System.out.println("1st Quarter"); 
     break; 
...   
} 

HTH, एंड्रियास

2

के बारे में क्या:

(day>=1 && day <=3) ? System.out.println("1st Quarter") : 
    (day >= 4 && day <= 6) ? System.out.println("2nd Quarter") : 
    (day >=7 && day <= 9) ? System.out.println("3rd Quarter") : 
     (day >= 10 && day <= 12) ? System.out.println("4th Quarter") : System.out.println("Error1"); 

;)

आप यह भी कर सकते हैं:

String val = (day>=1 && day <=3) ? "1st Quarter" : 
     (day >= 4 && day <= 6) ? "2nd Quarter" : 
     (day >=7 && day <= 9) ? "3rd Quarter" : 
      (day >= 10 && day <= 12) ? "4th Quarter" : "Error1"; 
System.out.println(val); 

मुझे लगता है कि या तो काम करना चाहिए।

+0

मैं इसे अपने वर्तमान कोड से कैसे बदलूं? – Zhianc

+0

ऊपर कोई भी काम करना चाहिए। टर्नरी ऑपरेटर या तो मूल्य निर्धारित कर सकते हैं या मूल्यांकन कर सकते हैं। –

+1

यह सिर्फ चालाक है। – cwallenpoole

3
  • तर्क के लिए पहली जगह में तर्क की आवश्यकता से बचें। टेबल लुकअप अक्सर एक उपयोगी तकनीक है। अंकगणितीय हेरफेर भी महत्वपूर्ण है - उन मूल्यों में एक पैटर्न की तलाश करें जिनकी आप परवाह करते हैं, और एक ऐसा फ़ंक्शन जो उन्हें सरल में बदल देता है। अधिक जटिल मामलों में बहुरूपता पर भी विचार करें।

  • यदि आप सभी अपवादों को उसी तरह से संभालने में हैं, तो इसे उसी स्थान पर करें।

  • स्कोप वैरिएबल कसकर जहां संभव हो।

  • आपके द्वारा वास्तव में इच्छित इनपुट के लिए संकेत, एफएफएस। :)

import java.io.*;

public class Quarter { 
    public static void main(String[] args) { 
     try { 
      System.out.print("Input the month number (1 = January, 2 = February ... 12 = December): "); 
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
      int month = Integer.parseInt(in.readLine()); 
      int quarter = (month - 1)/3; 
      String[] quarters = new String[]{ "1st", "2nd", "3rd", "4th" }; 
      System.out.println(quarters[quarter] + " Quarter"); 
     } catch (Exception e) { // IOException for non-numeric, or AIOOBE for out of range 
      System.out.println("Error!"); 
     } 
    } 
} 
+1

(-1 - 1)/3 == 0 – Robert

2

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

  • अगर-बाकी, समग्र कोड में आम है। के लिए एक व्यापक दर्शक के लिए पठनीयता के लिए अधिक परिचित बेहतर है।

  • यदि आपको आवश्यकताएं बदलती हैं तो आपको मौलिक संरचना नहीं बदली जाती है और आपको एक अलग डेटाटाइप का समर्थन करने की आवश्यकता होती है। मुझे में स्ट्रिंग तुलना करने के लिए enums पर बहुत सारे स्विच बदलना पड़ता है, जब कोई व्यक्ति आवश्यकता को जोड़ता है कि उपयोगकर्ता विकल्पों को कॉन्फ़िगर कर सकते हैं।

  • ब्रेक का उपयोग करने की आवश्यकता; ठीक से स्विच के अंदर अजीब बग के अवसर प्रदान करते हैं जो केवल कोने के मामलों में दिखाई देते हैं क्योंकि स्विच बड़े और जटिल होते हैं।

बेशक

व्यक्तिगत रूप से एक उद्यम प्रोग्रामर मैं एक timeUnitSubDivisionResolvingVisitor बनाया होगा ... :)

1

बस को लागू करने में यह एक मानचित्र के माध्यम से है का एक वैकल्पिक तरीका जा रहा है। यह इसे कॉन्फ़िगर करने योग्य बना देगा, विशेष रूप से आप स्प्रिंग का उपयोग कर रहे हैं, जहां आप निर्णय लेते हैं तो आप अपने bean.xml में यह मैप वैरिएबल सेटअप कर सकते हैं।

वैसे भी यहाँ

विकल्प है:

Map<Integer, String> m = new HashMap<Integer, String>(); 
m.put(1, "1st Quarter"); 
m.put(2, "1st Quarter"); 
m.put(3, "1st Quarter"); 
m.put(4, "2nd Quarter"); 
m.put(5, "2nd Quarter"); 
m.put(6, "2nd Quarter"); 
m.put(7, "3rd Quarter"); 
m.put(8, "3rd Quarter"); 
m.put(9, "3rd Quarter"); 
m.put(10, "4th Quarter"); 
m.put(11, "4th Quarter"); 
m.put(12, "4th Quarter"); 

System.out.println(m.get(d)); 
2
String[] suffix = new String[]{ "st", "nd", "rd", "th" }; 
System.out.println((1 <= day && day <= 12)? 
    String.format("%d%s Quarter", (day-1)/3+1, suffix[(day-1)/3]): 
    "Error!" 
); 
संबंधित मुद्दे