2013-11-18 3 views
0

Я расстраиваюсь чем-то действительно основным здесь. Сканер просто не делает то, что я хочу, и я не знаю, почему, я был бы очень благодарен, если бы кто-нибудь мог мне помочьJava - Проблемы со сканером

, поэтому я пытаюсь запрограммировать базовый инвентарь, и я хочу, чтобы сканер проверял, было ли введено правильное имя строителя. Строковая переменная хранит введенное пользователем слово, если было введено неправильное имя строителя. Я просто хочу, чтобы строковая переменная была равна «ЛЮБОЙ». То, что происходит, - строка получается правильной (в столицах, как я хотел) AS WELL как «Any», а это не должно быть !, когда вводится что-то недействительное, ничего не печатается (и он должен печатать «Any»)

я сделал простой SSCCE:

import java.util.Scanner; 

public class SSCCE { 

    public static void main(String[] args) 
    { 
     System.out.println("Enter a builder name: "); 
     Scanner scan = new Scanner(System.in); 
     //scan.useDelimiter("\\z"); // count a blank entry (end of input) 

     String entry_1 = scan.next(); 


     if (entry_1.equalsIgnoreCase("FENDER") 
         || entry_1.equalsIgnoreCase("MARTIN") 
         || entry_1.equalsIgnoreCase("GIBSON") 
         || entry_1.equalsIgnoreCase("COLLINGS") 
         || entry_1.equalsIgnoreCase("OLSON") 
         || entry_1.equalsIgnoreCase("RYAN") 
         || entry_1.equalsIgnoreCase("PRS")) 
     { 
      entry_1 = entry_1.toUpperCase(); 

      System.out.println(entry_1); 
     } 


    // if (entry_1.equals(entry_1.toLowerCase()) 
    //   || entry_1.equalsIgnoreCase(entry_1) 
    //   && (entry_1.equalsIgnoreCase("FENDER") 
    //     || entry_1.equalsIgnoreCase("MARTIN") 
    //     || entry_1.equalsIgnoreCase("GIBSON") 
    //     || entry_1.equalsIgnoreCase("COLLINGS") 
    //     || entry_1.equalsIgnoreCase("OLSON") 
    //     || entry_1.equalsIgnoreCase("RYAN") || entry_1 
    //      .equalsIgnoreCase("PRS"))) 
    // { 
    //  entry_1 = entry_1.toUpperCase(); 
    // } 

     if (!entry_1.equalsIgnoreCase("FENDER") 
       || !entry_1.equalsIgnoreCase("MARTIN") 
       || !entry_1.equalsIgnoreCase("GIBSON") 
       || !entry_1.equalsIgnoreCase("COLLINGS") 
       || !entry_1.equalsIgnoreCase("OLSON") 
       || !entry_1.equalsIgnoreCase("RYAN") 
       || !entry_1.equalsIgnoreCase("PRS")) { 

      entry_1 = "ANY"; 

      System.out.println(entry_1); 
     } 
    } 

} 

редактировать: спасибо за все ответы, теперь я просто имеющие проблемы с scan.useDelimiter ("\ г"); , когда ничего не вводится он должен сказать «ANY» и так это делает, но теперь она всегда будет говорить «ANY» даже для правильного ввода

+0

использовать trim(), чтобы удалить пустые места ввода. возможно, это поможет. Плюс совет по программированию, никогда не используйте несколько if, если вы можете заменить их одним циклом if-else. Это резко снижает нагрузку на процессор в случае больших программ. –

+0

@ADi Что такое 'if-else loop'? – nhgrif

+0

@nhgrif В C, если вы используете цикл if, за которым следует else, у него есть другой рабочий механизм только для набора if. Для каждого, если он ищет другие, которые имеют некоторые накладные расходы. исправьте меня, если я ошибаюсь. –

ответ

0

Во втором if, это гарантирует, что entry_1 не один случай, или это не один случай, ИЛИ ... Логика неверна , Вы хотите «и», с &&:

if (!entry_1.equalsIgnoreCase("FENDER") 
     && !entry_1.equalsIgnoreCase("MARTIN") 
     && !entry_1.equalsIgnoreCase("GIBSON") 
     && !entry_1.equalsIgnoreCase("COLLINGS") 
     && !entry_1.equalsIgnoreCase("OLSON") 
     && !entry_1.equalsIgnoreCase("RYAN") 
     && !entry_1.equalsIgnoreCase("PRS")) { 

    entry_1 = "ANY"; 

    System.out.println(entry_1); 
} 

Однако, было бы проще прикрепить его к первому if состояния как else:

if (entry_1.equalsIgnoreCase("FENDER") 
        || entry_1.equalsIgnoreCase("MARTIN") 
        || entry_1.equalsIgnoreCase("GIBSON") 
        || entry_1.equalsIgnoreCase("COLLINGS") 
        || entry_1.equalsIgnoreCase("OLSON") 
        || entry_1.equalsIgnoreCase("RYAN") 
        || entry_1.equalsIgnoreCase("PRS")) 
{ 
    entry_1 = entry_1.toUpperCase(); 

    System.out.println(entry_1); 
} 
else 
{ 
    entry_1 = "ANY"; 

    System.out.println(entry_1); 
} 
+0

Да, вы правы, спасибо u, кто-то еще отправил тот же ответ (@ в то же время: D) – Conor

+0

@Conor Да, люди, опубликованные примерно в одно и то же время. Но я рассказал, что проблема с логикой была _and_ альтернатива 'else', с самого начала. – rgettman

3

Ваше второе, если заявление, где вы проверяете !entry_1 и т.д., должны использовать && а не ||.

"FENDER" возвратит true для !entry_1.equalsIgnoreCase("MARTIN"); и т.д., и в списке || сравнения, только один из них должен быть true, чтобы сделать все это дело возвращения true.

+0

... или просто используйте 'else' после первого оператора if и избегайте делать эту логику во второй раз. – vikingsteve

+0

Да, это тоже. Но этот ответ пропускает логическую проблему, которая у него есть, что может снова занять голову в будущем, когда 'else' не является необязательным вариантом. Более того, он может не обязательно выполнять эти вещи в этом порядке. – nhgrif

+0

Справа. Если есть одна вещь, которую я помню из «CSC1001 - Концепции компьютерной науки», то это «(a || b || c) ==! (! A &&! B &&! C)'. – vikingsteve

0

Просто изменить всю вторую, если состояние с еще:

if (entry_1.equalsIgnoreCase("FENDER") 
          || entry_1.equalsIgnoreCase("MARTIN") 
          || entry_1.equalsIgnoreCase("GIBSON") 
          || entry_1.equalsIgnoreCase("COLLINGS") 
          || entry_1.equalsIgnoreCase("OLSON") 
          || entry_1.equalsIgnoreCase("RYAN") 
          || entry_1.equalsIgnoreCase("PRS")) 
      { 
       entry_1 = entry_1.toUpperCase(); 

       System.out.println(entry_1); 
      } 

      else { 

       entry_1 = "ANY"; 

       System.out.println(entry_1); 
      } 
0

Вы должны изменить ваше второе, если оператор с помощью || к &&:

if (!entry_1.equalsIgnoreCase("FENDER") 
        && !entry_1.equalsIgnoreCase("MARTIN") 
        && !entry_1.equalsIgnoreCase("GIBSON") 
        && !entry_1.equalsIgnoreCase("COLLINGS") 
        && !entry_1.equalsIgnoreCase("OLSON") 
        && !entry_1.equalsIgnoreCase("RYAN") 
        && !entry_1.equalsIgnoreCase("PRS")) { 

Если вы используете || только на e продолжения должно быть истинным для того, чтобы утверждение if было истинным и вызывало вывод ANY в качестве вывода. С &&всех заявление должно оценивать за истину до того, как если оператор будет выполнять и отображать ANY

0

Во втором случае() использование & & не ||. Это все;)

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