#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]