Как я могу использовать переменную флага для пользователя, чтобы завершить его ввод

#java #arraylist

#java #arraylist

Вопрос:

У меня есть список целых чисел, который будет заполнен пользователем, я хочу принимать ввод до тех пор, пока пользователь не захочет. Как я могу это сделать?

Я пробовал это, но меня это не удовлетворило. где s — конечный токен для пользователя.

 for(int i=0;input.nextInt()!='s';i  )
{   int a=input.nextInt();
    number.add(a);
}
  

Комментарии:

1. nextInt() вероятно, будет иметь больше смысла по сравнению с целым числом вместо символа. За исключением случаев, когда вы явно этого хотите.

Ответ №1:

Использование nextInt() не решит вашу проблему, поскольку оно сгенерирует исключение, как только пользователь введет нецелое число, поэтому ваше условие цикла никогда не будет выполнено. Также вы должны просто использовать while цикл вместо использования for цикла, поскольку количество итераций неизвестно. Я изменил ваш код. Обратитесь к коду и комментариям к коду ниже.

 import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> number = new ArrayList<>();
        String endToken = "s"; // this will be the holder of your end token
        while (true) { // iterate while user doesn't input the end token
            try {
                System.out.println("Enter an integer or enter 's' to exit!"); // ask the user for input
                String userInput = input.nextLine(); // get the user input
                if (userInput.equals(endToken)) { // check if user input is end token
                    break; // exit the loop
                }
                int a = Integer.parseInt(userInput); // convert the input into an int
                number.add(a); // add the input to the list
             // if an error inputs a String but not the end token then an exception will occur
            } catch (Exception e) {
                System.out.println("Invalid Input!"); // tell the user that the input is invalid and ask the input again
            }
        }

        input.close(); // don't forget to close the scanner

        // loop below is just used to print the user inputs
        System.out.println("Your inputs are: ");
        for (int i = 0; i < number.size(); i  ) {
            System.out.println(i);
        }
    }

}
  

Комментарии:

1. Почему это while (true) так? Это создаст бесконечный цикл.

2. Это не создаст бесконечный цикл, потому что после ввода пользователем endToken цикл завершится.

3. Хорошо, я пропустил это

4. @Mehrose вы можете проверить мое решение. И если это решило вашу проблему, не забудьте пометить ее как правильный ответ и / или проголосовать за нее 🙂

Ответ №2:

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

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    Scanner s = new Scanner(System.in);
    ArrayList<Integer> userNumber = new ArrayList<>();
    Pattern p = Pattern.compile("\d \d");
    Matcher m = null ;

    System.out.println("Enter your number list use chanracter 'NO' or 'no' as the terminator: ");
    String input = s.nextLine();
    String[] data = input.split(",");
    for(String word : data) {
        if(word.equals("NO") || word.equals("no")) {
            break;
        }
        //m = p.matcher(word).matches();
        if(p.matcher(word).matches()) {
            m = p.matcher(word);
            m.find();
            int n = Integer.valueOf((m.group()));
            userNumber.add(n);
        }else {
            System.out.println("Data entered "   word   " is not a number : ");
        }

    }
    System.out.println("Numbers entered are : "   userNumber);

}
  

Ввод

 12,12.1,123,"asd",123,"NO","NO"
  

Вывод

 Data entered 12.1 is not a number : 
Data entered "asd" is not a number : 
Data entered "NO" is not a number : 
Data entered "NO" is not a number : 
Numbers entered are : [12, 123, 123]
  

Комментарии:

1. Введите не целое число и InputMismatchException произойдет

2. @Mehrose не могли бы вы поделиться вводом, который вы пытаетесь… Возможно, я неправильно понял вопрос

3. Это приведет к неправильному выводу. Введите следующее: 12,12.1,123,"asd",123,"NO","NO" ожидаемый результат равен [12,123,123] , ваш результат равен [12]