并行阵列,接受多个输入

时间:2013-06-03 09:12:41

标签: java arrays

我目前正在尝试同时接受两个数组的输入。原因是阵列的每个位置处的数据是对应的,例如。姓名和身份证号码。

String[] arr = new String[5];
    int[] arr1 = new int[5];

    Scanner kb = new Scanner(System.in);
    for(int i = 0; i<5; i++)
    {
        System.out.println("Enter a name:");
        arr[i] = kb.nextLine();
        System.out.println("Enter an ID:");
        arr1[i] = kb.nextInt();
    }

到目前为止我有这个代码,但每当我运行它时,它会询问一个名称和ID,然后要求两者,但只接受ID。

我似乎无法弄清楚为什么它不允许输入名称,它只是返回一个不兼容的数据类型错误。

3 个答案:

答案 0 :(得分:5)

从第二次迭代开始,您的kb.nextLine()读取名称会吞下输入的\n新行字符以输入ID整数。

实际问题是nextInt()离开char令牌不是数字令牌,因此它们会留在stdin。每当任何其他方法尝试读取stdin时该方法接受该输入。 nextLine方法在\n之后返回,因此问题就出现了。

所以改变这样的代码:

String[] arr = new String[5];
        int[] arr1 = new int[5];

        Scanner kb = new Scanner(System.in);
        for(int i = 0; i<5; i++)
        {
            System.out.println("Enter a name:");
            arr[i] = kb.nextLine();
            System.out.println("Enter an ID:");
            arr1[i] = kb.nextInt();
            kb.nextLine();  //now this swallows new line
        }

或者你可以使用两个扫描仪:如果你想要的话应该没有任何关系给予输入......没有任何冲突......我不知道这是否效率低。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Tester {

public static void main(String[] args) throws Exception {

String[] arr = new String[5];
        int[] arr1 = new int[5];

        Scanner kb = new Scanner(System.in);
        Scanner  bc=new Scanner(System.in);
        for(int i = 0; i<5; i++)
        {
            System.out.println("Enter a name:");
            arr[i] = kb.nextLine();
            System.out.println("Enter an ID:");
            arr1[i] = bc.nextInt();
        }}
}

答案 1 :(得分:0)

您正在获得您描述的行为,因为nextInt()只读取下一行的下一个整数,而不是该行的剩余部分(为空。)所以当循环回来时nextLine() 1}}方法被调用,它拾取(空)行的其余部分。您应该在循环结束时放置kb.nextLine()方法,然后按照您的描述进行操作。

但是,在这样的并行数组中输入数据并不是最好的做法 - 你应该创建一个自定义类,然后将数组类型作为该类,或者使用ID的Map来命名。

答案 2 :(得分:0)

对我而言,这听起来像是在kb.nextInt()调用后仍然存储在输入缓冲区中的换行符,所以当你调用kb.nextLine()时,它会读取这个换行符(作为一个空字符串,因为nextLine()函数将在遇到的第一个换行符处停止,因此您的程序会要求您提供下一个ID。
有效地跳过随后要求提供名称的任何时间。

我可能会在kb.nextLine()调用后直接添加另一个kb.nextInt()调用,以清除缓冲区中的\ n(换行符)字符。