如何将不同长度的Scanner用户输入添加到ArrayList?

问题描述 投票:0回答:3

我正在尝试构建一个通过Scanner构建的整数ArrayList。用户必须输入5到10个整数才能使ArrayList有效,但在程序运行时实际的输入数量是未知的。

如何构建程序,只要用户输入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 && integerList.size() < 9) {
            break;
        }
    }
    return integerList;
}

谢谢!

java arraylist java.util.scanner
3个回答
0
投票

你的问题出在你的if语句中。看起来您正在尝试确保用户的输入具有超过4个整数且小于9个整数。但是,在实践中发生的事情是,您一次读取一个用户的输入,一旦您的用户输入数组大于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;
    }

0
投票

你有正确的检查想法,但没有把它放在正确的位置。如果它在循环内部,则每次给出任何输入时都将运行检查。这意味着当列表收到第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 && 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语句,以使您能够钳制或要求更多整数。话虽如此,如果它在范围内,它将只是通过,并返回列表。


0
投票

如果你想构建列表,只要用户输入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);
        } 
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.