2016-02-06 28 views
1

我有一個簡單的Java程序,我在Eclipse中運行。從命令行我傳遞了大約100個空格分隔的雙打列表,但是,請假設我不知道可以傳入多少項。Java掃描器 - 當項目總數未知時,輸入空間分隔兩倍

目前我正在閱讀整行,然後令牌化並轉換爲雙打,如下圖所示:

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

這是因爲while循環。 程序將永遠等待來自System.in的更多輸入,因爲sc.hasNextDouble()每次都會計算爲true,因爲System.in的輸入是無限的,這與來自文件的輸入不同。

對於我來說,第一個解決方案似乎是要走的路,如果你想在一條線上的所有雙打。 但是你可以清理它一點,並使用for-each而不是常規的for-loop。

例子:

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)); 
} 
+0

謝謝莫滕。我很欣賞這種迴應,因爲這有助於爲我澄清事情。 :) – greysqrl