2017-01-05 9 views
2

私は障害物や空きスペースがある(配列文字列の)フィールドを描きたい。 "+"は障害物であり、フリースペースはただ""です。空き領域がある場合は、"*"に置き換えてください。私はを選択します。その2次元配列の特定の要素は、""に等しく、それは"1"に置き換えられます。これらのコードの両方で同じ出力が得られないのはなぜですか?

私の質問は、以下の2つのコードを無視することができる限り長くはありません。ここに要約がありますが、不明な場合は最後までお読みください:

なぜこれらのものは互いに等しいわけではありませんか?

if(field[i][j]==field[5][1]){ 
    System.out.print("1"); 
} 

if(i==5 && j==1){ 
    System.out.print("1"); 
} 

最初のコードは動作しません。ここではその特定の配列要素は、私が1によって置き換えたいfield[5][1]次のようになります。

public class Test{ 
    public static void main(String[] args){ 

     String[][] field = {{"+" , "+" , "+" , "+" ,"+" , "+" , "+"}, 
          {"+" , "+" , "+" , "+" ,"+" , "" , "+"}, 
          {"+" , "+" , "+" , "+" ,"" , "" , "+"}, 
          {"+" , "+" , "+" , "" ,"" , "+" , "+"}, 
          {"+" , "" , "" , "" ,"+" , "+" , "+"}, 
          {"+" , "" , "+" , "+" ,"+" , "+" , "+"}, 
          {"+" , "+" , "+" , "+" ,"+" , "+" , "+"}}; 
     int x = field.length; 

     for(int i=0; i<x; i++){ 
      for(int j=0; j<field[i].length; j++){ 
       System.out.print(field[i][j]); 

       if(field[i][j] != "+"){ 
        if(field[i][j]==field[5][1]){ 
         System.out.print("1"); 
        } 
        else{ 
         System.out.print("*"); 
        } 
       } 
      } 
      System.out.println(""); 
     } 
    } 
} 

Output: 
+++++++ 
+++++1+ 
++++11+ 
+++11++ 
+111+++ 
+1+++++ 
+++++++ 

セカンドコード、必要に応じて動作します。

public class Test{ 
    public static void main(String[] args){ 

     String[][] field = {{"+" , "+" , "+" , "+" ,"+" , "+" , "+"}, 
          {"+" , "+" , "+" , "+" ,"+" , "" , "+"}, 
          {"+" , "+" , "+" , "+" ,"" , "" , "+"}, 
          {"+" , "+" , "+" , "" ,"" , "+" , "+"}, 
          {"+" , "" , "" , "" ,"+" , "+" , "+"}, 
          {"+" , "" , "+" , "+" ,"+" , "+" , "+"}, 
          {"+" , "+" , "+" , "+" ,"+" , "+" , "+"}}; 
     int x = field.length; 

     for(int i=0; i<x; i++){ 
      for(int j=0; j<field[i].length; j++){ 
       System.out.print(field[i][j]); 

       if(field[i][j] != "+"){ 
        if(i==5 && j==1){ 
         System.out.print("1"); 
        } 
        else{ 
         System.out.print("*"); 
        } 
       } 
      } 
      System.out.println(""); 
     } 
    } 
} 

Output: 
+++++++ 
+++++*+ 
++++**+ 
+++**++ 
+***+++ 
+1+++++ 
+++++++ 
+1

@Berger no - これらの文字列はすべてリテラルなので、それらを '=='で比較することができます。 –

+0

タイトルに「解決済み」を追加しないでください:回答を受け入れます。 –

答えて

2

2は明らかに異なっている:field[i][j]""ある場合

if(field[i][j]==field[5][1]){ 

は本当です - それに等しい配列要素がたくさんあります。 i == 5j == 1場合

if(i==5 && j==1){ 

が真である - 1つの位置にのみ真です。


最初のアプローチは、文字列を比較するために信頼性の高い方法ではないことに留意すべきである:それは唯一の理由は、あなたがそれがないように、コードが現在動作することをfieldを構築する方法です。一般的にはfield[i][j].equals(field[5][1])を使用してください。 How do I compare strings in Javaを参照してください。現在のフィールドの値が(それはあなたのケースで""です)field[5][1]の値に等しいかどうか

+0

非常にありがとう、私は理解しています:) –

2
if(field[i][j]==field[5][1]){ 
    System.out.print("1"); 
} 

この本は、フィールドの値を比較する[5] [1]これは ""と等しく、値 ""を持つすべてのフィールドは数字 "1"を出力します。このコードはフィールドの位置をチェックするのではなく、値を比較します。

+0

ありがとうございます! ^^ –

1
if (field[i][j] == field[5][1]) { 
    System.out.print("1"); 
} 

チェック。ご覧のとおり、""からfieldまでのすべての最初の出力マークは1です。

if (i==5 && j==1) { 
    System.out.print("1"); 
} 

は、現在の位置が5,1であるかどうかをチェックします。 fieldの値は考慮されません。

+0

私は理解してくれてありがとう:D –

0

場合(私の== 5 & & J == 1)が一つだけの場合、 も同様である(フィールド[I] [J] ==フィールド[5] [1])は、すべての場合について真である場合フィールド[5] [1]と同じ値である。( "")

あなたの質問が「なぜ== 2つの異なる文字列間で作業するのですか?

原因はコンパイラの最適化であり、同じ文字列ごとに定数を作成するので、2つの文字列の参照を異なる(i、j)で比較すると、実際は同じ文字列オブジェクトなのでそれは本当です。

関連する問題