【问题标题】:Cannot determine if the input has ended [duplicate]无法确定输入是否已结束 [​​重复]
【发布时间】:2016-04-14 00:37:56
【问题描述】:

我有以下输入。

    3
    sam
    99912222
    tom
    11122222
    harry
    12299933
    sam
    edward
    harry
    mark
    john

这是我的代码

public static void main(String[] argh) {
    Map<String, Integer> map = new HashMap<String, Integer>();
    List<String> keyList, outputList = new LinkedList<String>();
    Scanner in = new Scanner(System.in);
    int N = in.nextInt();
    for (int i = 0; i < N; i++) {
        String name = in.next();
        int phone = in.nextInt();
        in.nextLine();
        map.put(name, phone);
    }
    keyList = new ArrayList<String>(map.keySet());
    String s = in.nextLine();
    while (in.hasNext()) {
        if (keyList.contains(s)) {
            outputList.add(s + "=" + map.get(s));
        } else {
            outputList.add("Not found");
        }
        s = in.nextLine();
    }
    in.close();
    for (int i = 0; i < outputList.size(); i++) {
        System.out.println(outputList.get(i));
    }
}

我的问题是我无法确定输入是否结束,因为while (in.hasNext()) { 在最后一次输入后冻结。最后一次输入后如何关闭扫描仪?

【问题讨论】:

  • 你不能把String s = in.nextLine();作为while的第一行吗?
  • @cricket_007 即使在同样的事情发生后
  • 你有一个无限循环,只有在标准输入结束时才会结束。但是标准输入永远不会结束。它不像一个只有固定行数的文件。它不断地期望用户输入一些东西。因此,您需要指示最终用户键入一些特殊字符串,您的代码会识别为输入的结尾,并在您读取该特殊字符串后停止循环。
  • hasNextLine 怎么样?
  • 您应该定义一个“停止”输入值(例如,当给定输入 =“-1”时)break while

标签: java


【解决方案1】:

您的while 循环应该是:

while (in.hasNextLine()) {
    String s = in.nextLine();
    if (s.isEmpty())
        break;
    if (keyList.contains(s)) {
        outputList.add(s + "=" + map.get(s));
    } else {
        outputList.add("Not found");
    }
}

这样输入中的空行表示输入结束,这意味着您只需再次按 Enter 即可退出程序。

【讨论】:

  • 我已经编辑了这个问题。在处理最后一个输入后,代码在下一个 while 循环条件处冻结。
  • @PallavJha 那是因为程序不知道是否会提供更多输入。你还没有告诉它你已经完成了。就程序而言,简单地停止在键盘上打字并不是完成的标志,只是打字速度慢的标志。你必须做某事才能说“我完成了”。在这里我建议空行表示。
  • 所以你的意思是我必须尝试扫描仪以外的其他方法
  • @PallavJha 我的意思是当从控制台接收输入时,没有数据结束,因为用户总是可以输入更多的输入,所以你需要一些方式让用户说“我完成了”。这不是 Scanner 所特有的,所有从控制台读取输入的方式都有这个问题。
  • 谢谢。输入测试用例来自hackerrank,所以我不能在输入中添加任何额外的字符来停止循环。有没有办法应用你所说的。
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 2014-02-10
  • 2014-08-03
  • 2014-05-08
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多