Java Scanner - 当项目总数未知时,输入空间分隔为双倍

时间:2016-02-06 18:34:06

标签: java input java.util.scanner

我有一个简单的Java程序,我在Eclipse中运行。从命令行我传递了大约100个空格分隔的双打列表,但请假设我不知道可以传入多少项目。

目前我正在阅读整行,然后进行标记并转换为双打,如下所示:

    Scanner sc = new Scanner(System.in);

    ArrayList<Double> stock = new ArrayList<Double>();

    String s = sc.nextLine();

    String[] split = s.split("\\s+");

    for (int i=0; i<split.length; i++)
    {
        stock.add(Double.parseDouble(split[i]));
    }

因此,我相对确信上述不是解决此类问题的最佳方法。我想做更像下面代码的事情,但是当我在控制台中输入数据并点击回车时,程序无法响应,因为它没有将我的输入识别为双打列表。

    Scanner sc = new Scanner(System.in);

    ArrayList<Double> stock = new ArrayList<Double>();

    while (sc.hasNextDouble())
    {
        double d = sc.nextDouble();

        stock.add(d);
    }

所以,目前第一个代码示例工作正常,第二个代码没有做任何事情。顺便说一句,我试过添加sc.nextLine();在sc.nextDouble()之后;打电话,但这并没有什么不同。

我在这里做错了什么,或者我应该采取更好的方法。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

这是因为while循环。 该程序将永远等待来自System.in的更多输入,因为sc.hasNextDouble()每次都会评估为true,因为来自System.in的输入是无限的,与文件的输入不同。

对我来说,如果你想要一行中的所有双打,那么你的第一个解决方案似乎就是这样。 但你可以稍微清理它并使用for-each而不是常规的for循环。

示例:

Scanner scanner = new Scanner(System.in);

ArrayList<Double> doubles = new ArrayList<Double>();

String inputLine = scanner.nextLine();
String[] splittedInputLine = inputLine.split("\\s+");

for(String doubleString : splittedInputLine) {
    doubles.add(Double.parseDouble(doubleString));
}