2014-09-08 1 views
0

В моем консольном приложении я предоставляю пользователю возможность набирать «exit» в любой точке, чтобы вернуться в главное меню. Когда пользователь вводит данные, я вызываю его через консоль для разных вещей и собираю данные с помощью scanner.Как проверить одно и то же состояние после каждого шага без повторения одного и того же кода снова и снова в Java?

Мой вопрос в том, как я могу проверить, был ли пользователь введен «выходить» после каждого приглашения (в отличие от запрашиваемой информации) без необходимости использовать тот же оператор if после каждого шага?

Как я вижу, любые петли while или for недостаточны, потому что они проверяют только условие в начале, когда мне нужно проверить состояние между входами, и мне нужно, чтобы каждый ввод/запрос выполнялся только один раз за итерация.

Ключ здесь в том, что каждый запрос/код, выполняемый между проверками, является РАЗЛИЧНЫМ, поэтому петли не будут работать.

Вот несколько примеров кода:

String first; 
String second; 

Scanner input = new Scanner(System.in); 


//prompt user for input 
first = input.nextline(); 

if(first.equals("exit")){ 
    //return to start menu 
    input.close(); 
    return; 
} 

//prompt user for DIFFERENT input 
second = input.nextline() 

if(second.equals("exit")){ 
    //return to start menu 
    input.close(); 
    return; 
} 
+0

Я не знаю, что вы хотите создать, но вы можете создать массив, содержать вопрос insequence, и цикл через них с для/время цикла, а в теле цикла, есть один if для проверки выхода. – MikeNQ

ответ

0

Я предлагаю вам использовать слова List<String>. Вы можете return. Кроме того, это действительно плохая идея закрыть Scanner обертывание System.in, как только вы это сделаете, вы не можете повторно открыть его.

List<String> words = new ArrayList<>(); 
Scanner input = new Scanner(System.in); 
for (int i = 0; input.hasNextLine(); i++) { 
    String line = input.nextLine(); 
    words.add(line); 
    if (line.equalsIgnoreCase("exit")) { 
     break; 
    } 
} 
System.out.println(words); 
return words; 
+0

Хорошо, Я понимаю, что вы имеете в виду, но я просто не уверен, как его реализовать. Например, где бы я помещал подсказки для следующего ввода? они различаются каждый раз, потому что они просят разные вещи. Итак, эта функция, которую вы предоставили, будет запускаться после каждого приглашения? Я вижу, как это работает. И последний вопрос: я закрывал сканер и делал каждый раз каждый раз, когда мне это нужно. До сих пор это работало нормально. Есть что-то плохое в этом отношении? – zephos2014

+0

@ zephos2014 Что именно вы подскажете? Вы не включили их, но вы наверняка сохранили бы карту или список подсказок. Если у вас есть два метода, которые вводятся с помощью «Сканера» вокруг «System.in», и вы закрываете его в одном, другой метод никогда не получит ввода. –

+0

А ты ... на этот раз. Ну, пока я использую только один сканер за раз, что не должно быть проблемой, но я буду помнить об этом. Я никогда не думал, что смогу сохранить свои подсказки на карте. Это блестящая идея и просто может сделать трюк, таким образом, я могу использовать массив входных значений в общем цикле и каждый раз иметь уникальные подсказки. Спасибо! – zephos2014

2

Написать метод ...

public boolean isExit(String value) { 
    return value.equals("exit"); 
} 

Вы можете проверить этот метод каждый раз, когда ...

String value = input.nextLine(); 
if (!isExit(value) { 
    // Handle the normal text 
} else { 
    // Handle the exit operations... 
} 

Вы могли бы добавьте дополнительный код в проверку, но я бы предпочел иметь дополнительный метод, который обрабатывает операцию выхода ... например ...

String value = input.nextLine(); 
if (!isExit(value) { 
    // Handle the normal text 
} else { 
    doExit(); 
} 

Посмотрите на Defining Methods для получения более подробной информации ...

Обновлено

Фокус на идее, что метод должен сделать одно задание и не имеют никаких побочных эффектов ...

Сказав это, я бы установил свой код таким образом, чтобы, если пользователь вводит exit в приглашении, метод может выйти из него самостоятельно, без необходимости в return; заявления ...

Например ...

public int selectYourMeal() { 
    // Prompt... 
    int option = -1; 
    String value = input.nextLine(); 
    if (!isExit(value) { 
     // Handle the normal text 
    } else { 
     option = EXIT_OPTION; 
    } 
    return option; 
} 

Где EXIT_OPTION это особое значение, которое вызывающий абонент и идентифицировать и решать, как он считает нужным.

Я тоже старая школа, в которой мне учили, что метод должен иметь одну запись и одну точку выхода, вы действительно хотите избежать наличия нескольких точек выхода в своих методах, поскольку очень сложно следовать логике ...

+0

Я думаю, что проблема в том, что мне нужно вернуться из всего запущенного метода. Я забыл добавить его сначала (теперь редактируется), но оператор if имеет инструкцию 'return;', чтобы вырваться из всего метода. Есть ли другой способ сделать это? если я поместил оператор return в другой метод, он только вернется из этого метода, и мне пришлось бы написать еще один оператор if, чтобы проверить возвращаемое значение второго метода в любом случае, так что это не спасло бы меня от какого-либо кода. Дайте мне знать, если я ошибаюсь. – zephos2014

+0

Хорошо, поэтому «метод» должен выполнять одно задание. Здесь я сказал: 'isExit' должен возвращать' boolean' только тогда, когда значение 'value', которое оно предоставлено, равно' exit'. Вы можете поместить инструкцию 'return' в часть' else' вашего метода, но я бы предпочел, чтобы простой логический элемент содержался в контексте части '! IsExit', так что никаких других операций не произошло, и этот метод мог выйдите нормально ... – MadProgrammer

+0

Хорошо, я думаю, что вижу ваши рассуждения. Поэтому в этом случае каждый раз, когда я запрашиваю пользователя, я бы вызывал отдельный метод и вызывал метод isExit изнутри этих методов, правильно? Но тогда как избежать такой же проблемы на более высоком уровне, когда мне нужно вызвать каждый метод подсказки подряд, если не используется опция выхода. Я бы по-прежнему проверял условие после каждого шага, если бы я не мог каким-то образом прервать этот процесс. – zephos2014

2

Если я правильно вас понимаю, я рекомендую цикл while-while. Сначала он примет текст в первый раз, выполнит действие, и если он выйдет, он сломает цикл, иначе он будет повторяться.

do{ 
text = input.nextLine(); 

//whatever code you want here to perform with input 

}while(!(text.equals("exit")); 
+0

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

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