【问题标题】:Parallel Arrays, Accepting multiple inputs并行阵列,接受多个输入
【发布时间】:2013-06-03 09:12:41
【问题描述】:

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

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。

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

【问题讨论】:

标签: java arrays


【解决方案1】:

从第二次迭代开始,读取 name 的 kb.nextLine() 会吞下为输入 ID 整数而输入的 \n 换行符。

实际问题是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();
        }}
}

【讨论】:

  • 非常感谢伙计。我现在看到,它正在标准输入中读取。而不是等待用户输入,因此只跳到 ID。
  • @ShivekSukdeo 我认为如果您使用两台扫描仪就不会出现这种情况
【解决方案2】:

你得到了你描述的行为,因为nextInt() 只读取下一行的下一个整数,而不是该行的其余部分(它是空的。)所以当循环回来时nextLine() 方法被调用时,它会拾取(空)行的其余部分。您应该在循环末尾添加一个 kb.nextLine() 方法,然后它会按照您的描述进行操作。

但是,像这样在并行数组中输入数据并不是最佳实践 - 您可能应该创建一个自定义类,然后将数组类型作为该类,或者使用 ID 到名称的映射。

【讨论】:

  • 谢谢您,我通常只是创建一个包含其中所有特定值的对象并将其输入到数组中,但特定问题要求两个数组。一时间我都愣住了。
【解决方案3】:

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

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

【讨论】:

  • 这是@pinkpanther 所说的。
  • 看起来他打败了我 :)
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2014-10-28
相关资源
最近更新 更多