2011-07-28 8 views
10

可能性の重複:
If/Else vs. Switchより良い:switch-caseまたはif-else?

私はちょうど書き込み性の面で優れている2のどちら(のコードを書くのしやすさ)をお願いしたかったのとでは、ここで2つのコードを持っています読みやすさの条件(コードの理解の容易さ)。

スイッチケース:

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のサーチャーは、私が求めてかなりの数の質問に気づいた元 – Mark

+0

を見つけないように、これは、Javaであるとして同じことですが、別の言語のためです。多分、誰かがコミュニティのwikiに関する質問をし、各言語の質問をカバーする答えを持っているのでしょうか? – Wipqozn

答えて

36

どちらもない、私はこのいずれかの操作を行いたい:

1はあなたでしょう
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((day> 0 && day <13)?out [( 1日)/ 3]: "エラー!"); – emory

3

を好む?あなたのコードです。

私は間違いなくスイッチケースを好んでいますが、何かを組み合わせたものがあれば'より大きい' switch-caseは正しい方法ではありません。

もう一つ:私はそれを読むために優れていると思うので、私は、次のようにスイッチケースを記述します。

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は、コード全体でより一般的であり、それ自体の切り替え時間値をコンパイルする 制限されます。 の可読性がよくなるほどよく知られています。

  • 要件が変更され、別のデータ型をサポートする必要がある場合、基本的な構造は変更されません。 私は の文字列比較の列挙型スイッチをたくさん変更しなければなりませんでした。誰かがユーザに オプションを設定できるという要件を追加した時です。

  • ブレークを使用する必要があります。スイッチ内部が正しく設定されているため、 スイッチが大きく複雑になり、コーナーケースにしか表示されない奇妙なバグが発生する可能性があります。もちろん

は個人的には、企業の私は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!" 
); 
関連する問題