2017-05-11 9 views
1

2次元配列を使用してこのボードを作成した後、船にSが含まれているかどうかを確認します。しかし、私の配列は各行と列を見ているので、船は特定の位置にしかないので、テーブル全体ではなく、「船が見つかりません」と表示されます。助けてください!Java:配列から正しく検索することができません

import java.util.ArrayList; 
    import java.util.Scanner; 


    public class bord { 
     public static void main(String[] args) { 
      String Board[][]= new String[4][4]; 
      int n=0; 
      for(int i=0;i<4;i++) 
      { 
       for(int j=0;j<4;j++) 
       { 
        Board[i][j]="-"; 

       } 
      } 
      for(int i=0;i<4;i++) 
      { 
       for(int j=0;j<4;j++) 
       { 
        System.out.print(Board[i][j]); 
       } 
       System.out.println(); 
      } 
      System.out.println("_______________"); 

       //from here! 

      Board[1][1]="S"; 
      for(int i=0;i<4;i++) 
      { 
       for(int j=0;j<4;j++) 
       { 
        if(!Board[i][j].equalsIgnoreCase("S")) 
        { 

         n=1; 
        } 
       } 

      } 
      if(n==1) 
      { 
       System.out.println("No ship found"); 
      } 
      else 
       System.out.println("Found it"); 
     } 

    } 

答えて

0

変数nは常にBoard[i][j]の各チェックのために上書きされているからです。

だから n = 1 Board[1][1]をチェックするが、それはそう最終的に n = 0 Board[1][2]をチェックするときの直後に上書きされます。

私はこれに以下のコードを変更することをお勧めします:

//from here! 

Board[1][1]="S"; 
boolean isShipFound = false; //Variable to keep track if the ship has been found. 
for(int i=0;i<4;i++) 
{ 
    for(int j=0;j<4;j++) 
    { 
     if(Board[i][j].equalsIgnoreCase("S")) 
     { 
      isShipFound = true; 
      break; //Exits the j loop. 
     } 
    } 
    if (isShipFound) 
    { 
     break; //Exits the i loop. 
    } 

} 
if(!isFound) 
{ 
    System.out.println("No ship found"); 
} 
else 
    System.out.println("Found it"); 
} 
+0

私は何をすべきいや:/ –

0

わかりましたので、私はちょうどここに小さなロジックの問題を持っていると信じています。

あなたがしていることは、要素がSではない場合、あなたは船が見つからないと言います。あなたの2Dアレイ全体がSで満たされていれば、これはうまくいくでしょうし、Sが1つもなければうまくいくでしょう。しかし、あなたがifの声明ではなく、ifの声明を変更した場合、それは完全に機能します。私が説明します:

import java.util.ArrayList; 
import java.util.Scanner; 


public class bord { 
    public static void main(String[] args) { 
     String Board[][]= new String[4][4]; 
     int n=0; 
     for(int i=0;i<4;i++) 
     { 
      for(int j=0;j<4;j++) 
      { 
       Board[i][j]="-"; 

      } 
     } 
     for(int i=0;i<4;i++) 
     { 
      for(int j=0;j<4;j++) 
      { 
       System.out.print(Board[i][j]); 
      } 
      System.out.println(); 
     } 
     System.out.println("_______________"); 

      //from here! 

     Board[1][1]="S"; 
     for(int i=0;i<4;i++) 
     { 
      for(int j=0;j<4;j++) 
      { 
       if(Board[i][j].equalsIgnoreCase("S"))//I changed this line 
       { 

        n=1; 
       } 
      } 

     } 
     if(n==1) 
     { 
      System.out.println("Found it"); 
     } 
     else 
      System.out.println("No ship found"); 
    } 

} 

を一切sが存在しないこと、のが見つかった場合、それはnを1に設定しますが、1つのSがない場合、それはnを1に設定したことがないため、認識し、 。私はあなたがこれが役に立つと思うことを願っています。私はあなたに運が欲しいです! :)あなたのコード内のロジック以下

+0

他の回答が、それはJavaの提案のように - ではなく 'int型のN = '0'ブールisFound = false'をを使用し、' for'に追加し、ネストされましたで条件: 'for(int i = 0; i <4 &&!isFound; i ++)'と 'for'sの両方。ちょうど良いコーディング、より効率的なアルゴリズム。 – SHG

+0

真。私の目標は、OPに論理エラーを表示することでした。片方の足をもう一方の前に置く。 –

0

変更:

 for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 4; j++) { 
       if (Board[i][j].equalsIgnoreCase("S")) { 

        n = 1; 
       } 
      } 

     } 
     if (n == 1) { 
      System.out.println("Found it"); 
     } else { 
      System.out.println("No ship found"); 
     } 

Nのは最初は0であり、あなたが内側のループで用Sをチェックしているとき、それはすべてのためののn = 1を作っていました一致していない状態で配列の最後の位置が-の場合、n = 1となり、出力が間違っていたのです。

0
Board[1][1]="S"; 
outer: 
for(int i = 0; i < 4; i++) 
{ 
    for(int j=0; j < 4; j++) 
    { 
     if(Board[i][j].equalsIgnoreCase("S")) 
     { 
      System.out.println("Ship found"); 
      break outer; 
     } 
     else if(i == 3 && j == 3) 
     { 
      System.out.println("Ship not found"); 
     } 
    } 
} 
関連する問題