2011-07-28 55 views
10

可能重複:
If/Else vs. Switch更好:switch-case或if-else?

我這裏有兩個代碼,我只是想問問這兩個是可寫性方面更好(易於編寫代碼),並在可讀性條款(易於理解代碼)。

的switch-case:

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!"); 
     } 

    } 
} 

的if-else:

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

並不完全是重複的,因爲這是爲C#這是用java所以Java搜索將找不到原 – Mark

+0

我注意到問了不少問題同樣的事情,但用於不同的語言。也許有人應該寫一個社區wiki的問題,並且有一個涵蓋每種語言問題的答案? – 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

有12個月可以放入4箱,所以我們應該除以3. –

+7

我支持這個答案,但是爲了使它更好:System.out.println((day> 0 && day <13)?out [(天-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
  • 避免首先需要邏輯分支。查表通常是一種有用的技術。算術操作也很重要 - 在你關心的值中尋找一個模式,並將它轉換成更簡單的函數。在更復雜的情況下也要考慮多態性。

  • 如果您以相同的方式處理所有異常,請在同一地點執行。

  • 範圍變量儘可能緊密。

  • 提示您實際需要的輸入FFS。 :)如果問題是關於具體的代碼示例,或整體結構的解決方案

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

這我不清楚。所以,考慮if-else方法的一些優點。

  • 的if-else是在整體代碼多見,因爲通過開關接受的 數據類型數目是有限的,並切換本身被限制 編譯時間值。更熟悉的更適合於更廣泛的讀者對 的可讀性。

  • 如果您發現您的 需求發生變化並且您需要支持其他數據類型,則基本結構不會更改。 我必須改變大量的枚舉上的開關字符串比較我的時間 當有人添加了一個要求,用戶能夠 配置選項。

  • 需要使用break;在交換機內部正確引入 機會,因爲 交換機變得越來越龐大和複雜,這些奇怪的錯誤只會出現在角落案例中。

當然有個人的企業的程序員,我會創造一個timeUnitSubDivisionResolvingVisitor ... :)

1

實現它是通過一個地圖的只是一個替代方法。它會使其可配置,特別是你使用的是Spring,如果你決定的話,你可以在你的bean.xml中設置這個Map變量。

反正這裏是另類:

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!" 
);