2016-06-15 5 views
2

私はユーザーに文字列入力を求めるコードをいくつか持っています。Java:switchステートメントのオプションを出力する

switch (algorithm.toLowerCase()) { 

     case "selection sort": 
      // Selection sort stuff 
      break; 

     case "insertion sort": 
      // Insertion sort stuff 
      break; 

     case "exit": 
      // Default, just exit. 
      System.exit(0); 

自分自身ではないユーザーの場合、入力できるオプションはわかりません。明白な解決策は、それらにオプションを伝えるprintステートメントでハードコードすることですが、私はユーザー入力をキャプチャする前にスイッチのケースをプログラムで表示する方法があるのだろうかと思っていました。

私はオプションを含む何らかのデータ構造を考えていますが、どの方法がJavaを最も有効に活用し、標準的な方法に従うかはわかりません。

+0

簡単な方法が間違っていますか?オプションをハードコードして印刷するだけです。 –

+0

このようなシナリオでは、実際には「ハードコード」されている「メニュー」を印刷するのが一般的です。ほとんどの場合、ユーザーは少なくとも1文字以上の整数を入力するよう求められます。スイッチでの文字列の使用は、javaでは "古い"ものではありません。 – Fildor

答えて

7

switchのステートメントでは、ハードコードされた定数を使用して入力を比較しているため、あらかじめオプションを知っているとは限りません。

代わりにenumを使用してください(制限付きの「ハードコードされた」オプションを使用する標準的な方法)、enumswitchを使用することを検討してください。

ユーザー入力などのStringと比較すると、valueOfを呼び出すことができます。または、空白の値の場合は、独自の変換方法を使用できます(Javaの変数名には空白を含めることはできません)。以下のような

何か:

enum Options { 
    SELECTION_SORT("selection sort"), 
    INSERTION_SORT("insertion sort"), 
    EXIT("exit"); 
    String value; 
    Options(String value) { 
     this.value = value; 
    } 
    static Options forInput(String input) { 
     // TODO handle null/empty 
     for (Options option: values()) { 
      // ignoring case in comparison here 
      if (option.value.equalsIgnoreCase(input)) return option; 
     } 
     return null; // or throw IllegalArgumentException 
    } 
    // minimal print of all available values as expected input 
    static void printAll() { 
     for (Options o: values()) { 
      System.out.println(o.value); 
     } 
    } 
} 

が...そして...

switch (Options.forInput(algorithm)) { 
    case SELECTION_SORT: {// TODO} 
    // etc. 
} 

...ユーザーに利用可能な入力オプションを表示する Options.printAll()の呼び出しを追跡することができます。

+1

可能な改良点: 'EnumMap 'を使用してください。 'T'は' Supplier 'または' Runnable'のいずれかで、lambdaを入力してください。これは 'O(n)'の代わりに 'O(k)'のメリットがあります。これはGUIメニューでは問題ありませんが、大きな 'n'では重要です。もちろん、コンパイラはそれをテーブルに挿入することはできますが、コンパイラは信頼できません。機能プログラミングはすごく面白いですよ。 – Centril

+0

@Centril nice idea。おそらく、この例のための少し残酷私は思う:) – Mena

+0

それを扱うための素晴らしいアプローチのように見える、私はスイッチできれいに見えるように、すべてのオプションが一緒にオプションの列挙型でブロックされます。私はそれを受け入れる前に他の答えがある場合のためにちょっと待つ:) –

関連する問題