2017-04-11 9 views
0

質問文が意味をなさないかもしれないが、私はそれをどのように動作させるか分からなかった。私はこのコードを持っている場合はユーザーが入力した変数を、最大値を知らずにswitchステートメント

::私は例をお見せしましょう

Socket socket = new Socket(IP_ADDRESS, PORT_NUMBER); 
for (int i = 0; i < someUpperLimit; i++) { 
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
    switch(i) { 
     case 1: 
      out.write("2,3,4"); 
     case 2: 
      out.write("1,3,4"); 
     case 3: 
      out.write("1,2,4"); 
     case 4: 
       out.write("1,2,3"); 
     ... 
    } 
} 

私が午前問題はsomeUpperLimitの値はユーザが入力した値は、コマンドラインを形成し、私にはわからないということですそれは私がforループに入っているときの価値です。だからswitch文では、私が書く必要があるケースがいくつあるか分かりません。

それぞれのケースステートメントでは、ケースステートメントにない値を相手のサーバーソケットに送信したいとします。したがって、ケースの値が1の場合、私は2,3,4を送信したいと思います。私はこのケースで必要なケースステートメントがどれくらいかわからないので、これを行う別の方法がありますか?

+0

などの値に相当し、どの値をサーバーに送信する必要がありますか? 1からupperLimitまで? – stinepike

+0

@StinePikeはいケースが「1」の場合は、「2 to someUpperLimit」を送信します。ケースが '2'の場合、' 1、3 - someUpperLimit'を除いて2を返します。 – CapturedTree

+2

すべてのケースがわからない場合、 'switch'ステートメントを使用することはできません。 'if'文で2番目の' for'ループを使います。 –

答えて

3

for (int x = 1; x <= someUpperLimit; x++) { 
    StringBuilder sb = new StringBuilder(); 
    for (int y = 1; y <= someUpperLimit; y++) { 
     if (y != x) { 
      if (sb.length() != 0) { 
       sb.append(","); 
      } 
      sb.append(y); 
     } 
    } 
    out.write(sb.toString()); 
} 
1

あなたのケースのswitch文は冗長です。単純にArrayListを作成し、1からsomeUpperLimitまでの値で入力します。その後、ループ内でリストからi要素を削除し、outに書き込んでください。

1

switch caseステートメントをまったく使用する必要はありません。あなたの要件に応じて、以下を行うことができます。

  1. 1からsomeUpperLimitまでのArrayListを入力します。
  2. 1からsomeUpperLimitまでの各iについて、i以外のArrayListからすべての要素を送信します。あなたは、Java 8+を使用していない、またはあなたが上記を理解していない場合、あなたは、IntStreamのペア(S)

    IntStream.rangeClosed(1, someUpperLimit) 
         .forEachOrdered(x -> out.write(IntStream.rangeClosed(// 
             1, someUpperLimit).filter(y -> x != y) // 
         .mapToObj(String::valueOf).collect(Collectors.joining(",")))); 
    

    のような巣をJavaの8+を可能性が使用していると仮定すると、

関連する問題