JAVA比较两个字符串是不行

时间:2016-08-09 19:37:46

标签: java

所以,这是我正在处理的代码片段:

String direction = s.readLine();
System.out.println(direction);
if (direction.equals("up") != true && direction.equals("down") != true &&
  direction.equals("left") != true && direction.equals("right") &&
  direction.equals(null) != true) {
    System.out.println("Invalid Solution file");
    System.exit(0);
}

它应该做的是从文本文件中读取一行(使用BufferedReader)然后如果该行不是有效方向或空白则应该打印"无效的解决方案"并退出。

问题是无论方向字符串是什么,if语句仍然运行。我输入了一个println来检查方向是否正确读取但看起来绝对没问题。那么为什么代码不按预期工作呢?

7 个答案:

答案 0 :(得分:5)

您的部分问题是可读性。解决这个问题,你的问题解决了90%:

private static List<String> DIRECTIONS = Arrays.asList("up", "down", "left", "right");

然后

if (!DIRECTIONS.contains(direction)) {
    System.out.println("Invalid Solution file");
    System.exit(0);
}

另外10%是如何检查null,direction == null,但如果您使用此代码则不需要,因为contains(null)将方便地返回false

答案 1 :(得分:1)

这里&& direction.equals("right")我认为你犯了一个错误,因为它与其他人存在矛盾:

direction.equals("up") != true && 
direction.equals("down") != true && 
direction.equals("left") != true

你在大多数条件下测试否定,但direction.equals("right")测试肯定。

尝试它,它是相同的,但更简洁,更可读:

if (direction !=null && !direction.equals("up") && 
                        !direction.equals("down") &&  
                        !direction.equals("left") && 
                        !direction.equals("right") ){
           System.out.println("Invalid Solution file");
           System.exit(0);
       }

答案 2 :(得分:1)

你的代码比它需要的要复杂得多。

请考虑一下:

Set<String> validDirections = new HashSet<>(Arrays.asList("up", "down", ...
if (validDirections.contain(direction.toLowerCase()) {
  // good ...
} else {
  // bad ..
}

例如,您可以将validDirections设为全局常量;所以它也可以在其他地方使用。

我在这里要解释的是:您的代码是低级。低级代码很难编写,读取,维护和扩展。编程始终是关于创建良好的抽象。反之亦然:如果你不使用抽象,你最终会得到非常抽象的代码,就像你在这里展示的代码一样!

例如:如果你需要另一个方向,那么你必须把你的方法放得太复杂了。在我的解决方案中,您只需将其放入构建该Set的语句中。

最后:你的错误信息,什么也没说。所以,那个字符串很糟糕;但为什么呢?至少打印导致错误的字符串会不会更好?!

答案 3 :(得分:0)

首先,你不应该将!= true与布尔语句一起使用,这是不好的形式。像这样改写:

direction !=null && !direction.equals("up") && !direction.equals("down") && !direction.equals("left") && !direction.equals("right")

您的错误是您没有将!= true部分包含在化合物中的某个语句中。替换为上面的代码来解决问题。

答案 4 :(得分:0)

我很困惑为什么你在使用!=当你的.equals方法已经返回一个布尔值时为真。试试这个。

String direction = s.readLine();
    System.out.println(direction);
    if ( direction!=null && !direction.equals("up") && !direction.equals("down")&& !direction.equals("left")&& direction.equals("right")){
        System.out.println("Invalid Solution file");
        System.exit(0);
    }

答案 5 :(得分:0)

quals方法返回一个布尔值,因此不需要将结果与true或false值进行比较。此外,我将从null比较开始 - 缩短了Java中的布尔表达式,因此如果将完成此部分,则不评估表达式的其余部分。正确的表达式可能如下所示:

if (direction == null || (!direction.equals("up") && !direction.equals("down") && !direction.equals("left") && !direction.equals ("right "))) {
}

但是这段代码不可读。您可以使用枚举或字符串列表,如下所示

    List<String> directions = Arrays.asList("up", "down", "left", "right");
    String direction = "readValue"
    if (!directions.contains(direction)) {
        System.out.println("Invalid direction");
        System.exit(0)
    }

答案 6 :(得分:0)

请尝试以下代码:

boolean match = false;

if (direction.equals("up"))
{ match = true; }
if (direction.equals("down"))
{ match = true; }
if (direction.equals("left"))
{ match = true; }
if (direction.equals("right"))
{ match = true; }
if (direction.equals(null))
{ match = true; }
if (match == false){
    System.out.println("Invalid Solution file");
    System.exit(0);
}

您可能还希望在从文件读取后修剪方向字符串。