如何在while循环内使用Scanner hasNextInt()?

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

我无法退出while循环。

我不知道为什么sc.hasNextInt()在上次读取后没有返回false。

我应该使用其他方法还是我的代码有错误?

public static void main(String[] args) {

        // Creating an array by user keyboard input
        Scanner sc = new Scanner(System.in);

        System.out.println("Length of array: ");
        int[] numbers = new int[sc.nextInt()];

        System.out.printf("Type in integer elements of array ", numbers.length);
        int index = 0;
        **while ( sc.hasNextInt()) {**
            numbers[index++] = sc.nextInt();


        }
        // created method for printing arrays
        printArray(numbers);
        sc.close();


}
java while-loop java.util.scanner
3个回答
0
投票

执行以下操作:

使用输入长度作为循环的结尾。

        // Creating an array by user keyboard input
        Scanner sc = new Scanner(System.in);

        System.out.println("Length of array: ");

        int len = sc.nextInt();
        int[] numbers = new int[len]; // use len here

        System.out.printf("Type in integer elements of array ", numbers.length);
        int index = 0;
        for (index = 0; index < len; index++) { // and use len here
            numbers[index] = sc.nextInt();
        }
        // created method for printing arrays
        printArray(numbers);
        sc.close();

并且不要关闭扫描仪。


0
投票

当您从控制台接收输入时,位于hasNextInt()循环条件内的Scanner while方法将继续读取(意味着循环将继续),直到发生以下情况之一:

  • 您提交了非数字符号(例如字母)。
  • 您提交了一个所谓的“ end of file”字符,这是一个特殊的符号,告诉扫描仪停止读取。

因此,在您的情况下,您不能在while循环条件内使用hasNextInt()-我在下面显示了一个可以使用计数器变量的解决方案。

然而hasNextInt()循环中的while方法在从控制台以外的其他来源读取时具有实际用途-例如从字符串或文件。从示例here中得到启发,假设我们有:

String s = "Hello World! 3 + 3.0 = 6 ";

然后我们可以将字符串s作为输入源传递给Scanner(注意,我们没有将System.in传递给构造函数:]

Scanner scanner = new Scanner(s);

然后循环直到hasNext(),它检查输入中是否存在其他任何类型的标记。在循环内,使用hasNextInt()检查此令牌是否为int并打印,否则使用next()将令牌传递给下一个令牌:

while (scanner.hasNext()) {
    if (scanner.hasNextInt()) {
        System.out.println("Found int value: " + scanner.next());
    } else {
        scanner.next();
    }
}

结果:

Found int value: 3
Found int value: 6

在上面的示例中,我们无法在while循环条件本身中使用hasNextInt(),因为该方法在找到的第一个非整数字符上返回false(因此循环立即关闭,因为我们的String以字母开头) 。

但是,我们可以使用while (hasNextInt())来读取list of numbers from a file

现在,解决您的问题index变量放在while循环条件内:

while (index < numbers.length) {
    numbers[index++] = sc.nextInt();
}

或者为了清楚起见,请设置一个特定的计数器变量:

int index = 0;
int counter = 0;
while (counter < numbers.length) {
       numbers[index++] = sc.nextInt();
       counter++;
}

0
投票

解决您的代码中的以下问题:

  1. 将数组的大小存储到变量中(例如int n = sc.nextInt();),并使用该值创建所需大小的数组(即int[] numbers = new int[n];)并控制循环应执行的次数(即[ C0])。
  2. 尽管对于此特定程序不是必需的,但您不应关闭while (index < n && sc.hasNextInt()) {...}Scanner对象,因为它也会关闭System.in,这将不允许使用System.in(例如键盘)进行任何进一步的输入。在大型程序中,您可能需要进一步输入,这可能是个问题。

下面给出的代码结合了上述要点:

System.in

示例运行:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // Creating an array by user keyboard input
        Scanner sc = new Scanner(System.in);

        System.out.print("Length of array: ");
        int n = sc.nextInt();
        int[] numbers = new int[n];

        System.out.printf("Type in %d integer elements of array: ", numbers.length);
        int index = 0;
        while (index < n && sc.hasNextInt()) {
            numbers[index++] = sc.nextInt();
        }
        // created method for printing arrays
        printArray(numbers);
    }

    static void printArray(int[] numbers) {
        for (int n : numbers) {
            System.out.print(n + " ");
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.