![](/img/trans.png)
[英]Using if with Scanner in Java isn't working properly when comparing strings
[英]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.