2016-08-09 2 views
2

Так вот фрагмент кода я работаю над: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, чтобы проверить, правильно ли читается направление, но это выглядит абсолютно нормально. Так почему же код не работает так, как предполагалось?

+2

Кроме того, '! = True' выглядит странно. Вместо этого используйте оператор '!' («Not») для каждого термина. –

+0

'direction.equals (null)! = True' вы пытаетесь сравнить с пустой строкой? это должно быть 'direction.equals (" ")! = true' – tanjir

+2

@mmm Это неверно на основании его проблемы, он действительно хочет' && ', потому что он пытается найти строковые записи, которые не соответствуют ни одному из действительных направлений –

ответ

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

Во-первых, вы не должны использовать != true с логическим утверждением, что это плохой форме. Перепишите, как это:

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

Ваша ошибка в том, что вы не включили != true часть на одном из ваших утверждений внутри соединения, если. Замените вышеуказанный код, чтобы решить проблему.

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% было, как проверить нуль, что direction == null, но если вы используете этот код не необходимо, потому что contains(null) будет удобно возвращать false.

1

Вы код намного сложнее, чем нужно.

Рассмотрим вместо этого:

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

Вы можете сделать validDirections глобальная константа, например; поэтому его можно было бы использовать и в других местах.

Что я пытаюсь объяснить здесь: ваш код низкоуровневый. Низкий уровень кода трудно писать, читать, поддерживать и расширять. Программирование всегда связано с созданием хороших абстракций. Или наоборот: если вы не используете абстракции, вы получите довольно абстрактный код, например тот, который вы показываете здесь!

Например: если вам нужно другое направление, вы должны положить в свой уже слишком сложный, если условие. В моем решении вы просто помещаете его в утверждение, которое создает этот набор.

И наконец: ваше сообщение об ошибке, ничего не говорит. Итак, эта строка плохая; но почему? Не лучше ли, по крайней мере, напечатать строку, вызвавшую ошибку?

0

Я смущен, почему вы используете! = True, когда ваш метод .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); 
    } 
0

Метод Quals возвращает логическое значение, так что результат не должен быть по сравнению с истинным или ложным значением. Кроме того, я бы начал с нулевого сравнения - булевские выражения в 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) 
    } 
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); 
} 

Вы также можете обрезать строку направления после чтения из файла.

Смежные вопросы