簡體   English   中英

JAVA比較兩個字符串不起作用

[英]JAVA Comparing two Strings isn't working

所以這是我正在研究的代碼片段:

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來檢查方向是否正確讀取但看起來絕對沒問題。 那么為什么代碼不按預期工作呢?

您的部分問題是可讀性。 解決這個問題,你的問題解決了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

這里&& 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);
       }

你的代碼比它需要的要復雜得多。

請考慮一下:

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

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

我在這里要解釋的是:你的代碼是低級的 低級代碼很難編寫,讀取,維護和擴展。 編程始終是關於創建良好的抽象 反之亦然:如果你不使用抽象,你最終會得到非常抽象的代碼,就像你在這里展示的代碼一樣!

例如:如果你需要另一個方向,你必須在你已經很復雜的情況下加入。 在我的解決方案中,您只需將其放入構建該Set的語句中。

最后:你的錯誤信息,什么也沒說。 所以,那個字符串很糟糕; 但為什么呢? 至少打印導致錯誤的字符串不是更好嗎?!

首先,你不應該使用!= true和布爾語句,它是不好的形式。 像這樣改寫:

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

您的錯誤是您沒有在化合物中的某個語句中包含!= true部分if。 替換為上面的代碼來解決問題。

我很困惑你為什么使用!=當你的.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);
    }

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)
    }

請嘗試以下代碼:

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);
}

您可能還希望在從文件讀取后修剪方向字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM