为什么这两个代码都不能提供相同的输出?

时间:2017-01-05 10:14:45

标签: java arrays string printing syntax

所以我想绘制一个带有障碍物和自由空间的场(数组串)。 "+"是障碍物,自由空间只是""。如果我们有一个可用空间,我希望它被"*"取代。我将选择该等二维数组的一个特定元素,该元素等于"",并且将被"1"替换。

我的问题似乎没有,你可以忽略下面的2个代码。以下是摘要,如果不清楚,请阅读到最后:

为什么这些事情彼此不相同?

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

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

第一个代码不起作用。这里的特定数组元素将是field[5][1],我希望将其替换为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+++++
+++++++

4 个答案:

答案 0 :(得分:2)

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

这将比较字段[5] [1]的值等于“”,并且每个具有值“”的字段打印数字“1”。此代码不检查字段位置,而是比较值。

答案 1 :(得分:2)

两者显然不同:

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

如果field[i][j]"",则为真 - 并且有许多数组元素与此相等。

if(i==5 && j==1){
如果i == 5j == 1 - 仅在1位置为真,则

为真。

应该注意的是,第一种方法不是比较字符串的可靠方法:它只是因为构造代码当前行为的field的方式。通常,您应该使用field[i][j].equals(field[5][1])。请参阅How do I compare strings in Java

答案 2 :(得分:1)

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

检查当前字段的值是否等于field[5][1]的值(在您的情况下为"")。如您所见,第一个输出标记来自""的每个field 1

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

检查当前位置是否为5,1。不考虑field的值。

答案 3 :(得分:0)

如果(i == 5&amp;&amp; j == 1)仅适用于一个案例,  if(field [i] [j] == field [5] [1])对于具有与field [5] [1]相同值的所有情况都为真。 ( “”)

如果您的问题是“为什么= =在两个不同的字符串之间工作?”

原因是编译器的优化,谁将为每个相同的字符串创建一个constante,所以当==比较两个字符串与不同(i,j)的引用时,它实际上是相同的String对象,所以它是真。