#java #arraylist #java.util.scanner
#java #arraylist #java.util.scanner
Вопрос:
Я пытаюсь создать ArrayList целых чисел, который создается с помощью Scanner. Пользователь должен ввести от 5 до 10 целых чисел, чтобы список массивов был действительным, но фактическое количество входных данных будет неизвестно во время запуска программы.
Как мне построить программу так, чтобы она выполнялась только до тех пор, пока пользователь вводит 5,6,7,8,9 или 10 целых чисел?
Предполагается, что пользователь вводит все целые числа в одной строке, но приведенный ниже код отключает его после 5-го целого числа, даже если после него есть еще
public static ArrayList arrayListBuilder() {
Scanner input = new Scanner(System.in);
ArrayList<Integer> integerList = new ArrayList();
System.out.println("Enter 5-10 ints");
while (input.hasNextInt()) {
integerList.add(input.nextInt());
if (integerList.size() > 4 amp;amp; integerList.size() < 9) {
break;
}
}
return integerList;
}
Спасибо!
Комментарии:
1. Ну, конечно, потому что
integerList.size() > 4
. Кроме того,integerList.size() < 9
является избыточным.2. почему
new ArrayList();
вместо new ArrayList<>();
Ответ №1:
Ваша проблема в вашем операторе if. Похоже, вы пытаетесь убедиться, что пользовательский ввод содержит более 4 целых чисел и менее 9 целых чисел. Однако на практике происходит то, что вы считываете введенные пользователем данные по одному int за раз, и как только ваш массив пользовательских входных данных становится больше 4, вы останавливаетесь. Есть несколько вещей, которые вы могли бы попробовать, если хотите сохранить его примерно в том же формате. Переместите проверку нижней границы за пределы цикла while, чтобы программа заполнила ваш список массивов, а затем проверила, достаточно ли он велик. Если он недостаточно велик, выполните резервное копирование. Затем внутри цикла while сохраните проверку на верхнюю границу. Я считаю, что это позволит выполнить то, что вы пытаетесь сделать. Я приложил пример кода, который может помочь.
public static ArrayList arrayListBuilder() {
Scanner input = new Scanner(System.in);
ArrayList<Integer> integerList = new ArrayList();
while (true){
integerList.clear();
System.out.println("Enter 5-10 ints");
Boolean rightSize = true;
while (input.hasNextInt()) {
integerList.add(input.nextInt());
if (integerList.size() > 9) {
rightSize = false;
break;
}
}
if (integerList.size() < 5){
rightSize = false;
}
if (rightSize){
break;
}
}
return integerList;
}
Ответ №2:
У вас есть правильное представление о проверке, но она не находится в нужном положении. Если это находится внутри цикла, проверка будет выполняться каждый раз, когда вводится какой-либо ввод. Это означает, что когда список получит 5-й элемент, проверка вернет true и завершит цикл. Вместо этого вы должны прочитать как можно больше входных данных (или иметь какой-то максимум, например 10) и выполнить проверку впоследствии. Это может выглядеть примерно так:
public static ArrayList arrayListBuilder() {
Scanner input = new Scanner(System.in);
ArrayList<Integer> integerList = new ArrayList();
System.out.println("Enter 5-10 ints");
while (input.hasNextInt()) {
integerList.add(input.nextInt());
if (integerList.size() > 10)
break;
}
if (!(integerList.size() >= 5 amp;amp; integerList.size() <= 10)) {
throw new IllegalArgumentException("Received too many integers");
}
return integerList;
}
Это позволит, вместо того, чтобы проверять размер на каждой итерации цикла, проверять, выходит ли размер списка за пределы границ впоследствии, когда у сканера больше нет целых чисел для выдачи или больше максимального (это новая проверка, если размер больше 10, которую можно опустить). Как только цикл завершен, выполняется новая проверка, и если их больше или меньше желаемого числа, выдается ошибка.
Если вы предпочитаете, чтобы это не выдавало ошибку, вы могли бы выполнить одну проверку, чтобы увидеть, находится ли она выше или ниже желаемого диапазона, но делая что-то вроде этого:
if (integer.size() > 10) {
// Clamp the size of the list to the correct length, being 10
} else if (integer.size() < 5) {
// Ask for more numbers, or throw an error
}
Это заменило бы другую проверку вне цикла и позволило бы больше настраивать обработку размеров.
Что делает эта новая проверка, так это проверяет, больше ли размер, чем большая сторона диапазона, и else if
проверяет, меньше ли размер, чем малая сторона диапазона. В целом, это просто разделение предыдущей проверки на два оператора if, чтобы у вас была возможность сжимать или запрашивать больше целых чисел. При этом, если он находится внутри диапазона, он просто пройдет через и вернет список.
Ответ №3:
Если вы хотите создать список до тех пор, пока пользователь вводит 5,6,7,8,9 или 10, и вы не знаете фактический размер допустимого ввода, вот что я придумал:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class ArrayListBuilder {
public static void main(String[] args) {
arrayListBuilder();
}
public static List<Integer> arrayListBuilder() {
List<Integer> referenceList = Arrays.asList(5, 6, 7, 8, 9, 10);
List<Integer> inputList = new ArrayList<>();
getUserInput(referenceList, inputList);
System.out.println(inputList);
return inputList;
}
private static void getUserInput(List<Integer> referenceList, List<Integer> inputList) {
System.out.println("Enter 5-10 ints");
Scanner input = new Scanner(System.in);
int userInput = input.nextInt();
if (referenceList.contains(userInput)) {
inputList.add(userInput);
getUserInput(referenceList, inputList);
}
}
}