回答
在Java中這樣做有沒有更快的方法?
是的。掃描儀相當慢(至少根據我的經驗)。
如果你不需要驗證輸入,我建議你只是將流封裝在BufferedInputStream中,並使用諸如String.split
/Integer.parseInt
之類的東西。
一個小對比:
閱讀使用此代碼
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
sum += scanner.nextInt();
17兆(4233600號),把我的機器3.3秒上。而這個片段
BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = bi.readLine()) != null)
for (String numStr: line.split("\\s"))
sum += Integer.parseInt(numStr);
了0.7秒。
通過進一步搞亂的代碼(迭代line
與String.indexOf
/String.substring
),你可以把它降低到0.1秒左右很容易,但我想我已經回答了你的問題,我不想把它變成一些代碼高爾夫。
然而,你最好有一個很好的理由爲你的代碼添加這樣的混亂。 –
String.split不如StringTokenizer快。爲了獲得最高效的代碼,使用StringTokenizer – kullalok
您可以通過數字方式從System.in
中讀取數字。看看這個答案:https://stackoverflow.com/a/2698772/3307066。
我在這裏複製代碼(幾乎沒有修改)。基本上,它讀取整數,由不是數字的任何東西分隔。 (原作者致謝。)
private static int readInt() throws IOException {
int ret = 0;
boolean dig = false;
for (int c = 0; (c = System.in.read()) != -1;) {
if (c >= '0' && c <= '9') {
dig = true;
ret = ret * 10 + c - '0';
} else if (dig) break;
}
return ret;
}
在我的問題,這個代碼是約。比使用StringTokenizer
快2倍,這已經快於String.split(" ")
。 (問題涉案讀取高達100萬每1個百萬個整數。)
我創建了一個小InputReader類作品就像Java的掃描儀,但許多幅度優於它的速度,事實上,它優於BufferedReader中的好。這裏是一個棒形圖,我創建閱讀不同類型從標準輸入數據的InputReader類的性能:
以下是查出所有號碼從系統傳來的總和的兩種不同的方法.in使用InputReader類:
int sum = 0;
InputReader in = new InputReader(System.in);
// Approach #1
try {
// Read all strings and then parse them to integers (this is much slower than the next method).
String strNum = null;
while((strNum = in.nextString()) != null)
sum += Integer.parseInt(strNum);
} catch (IOException e) { }
// Approach #2
try {
// Read all the integers in the stream and stop once an IOException is thrown
while(true) sum += in.nextInt();
} catch (IOException e) { }
不幸的是''InputReader.readLine()'在OpenJKD8中比'BufferedReader.readLine()'快不了。緩衝區大小爲2048,流長度爲2.5 MB。但更糟的是:代碼中斷(UTF-8)字符編碼。 –
- 1. 從Java中的文本文件中讀取最快的方法是什麼?
- 2. 什麼是從DbDataReader讀取數據的最快方法?
- 3. 在Delphi中讀取大文件的最快方法是什麼?
- 4. 在PHP中讀取文件的最快方法是什麼?
- 5. 在Ruby中讀取大文件的最快方法是什麼?
- 6. 什麼是逐行讀取文件的最快方法?
- 7. 什麼是從文件中讀取字符串的最快方法?
- 8. 使用java獲取HTML內容的最快方法是什麼?
- 9. 從System.in讀入 - Java
- 10. Java:當從System.in讀取時實現InputStream的read()方法
- 11. Java:什麼是讀取序列化對象的最佳方法?
- 12. 什麼是從HBase提取數據的最快方法
- 13. 從NSString中抽取數字的最快和最有效的方法是什麼?
- 14. 什麼是Java中最快的子串搜索方法
- 15. 在java中反序列化JSON的最快方法是什麼
- 16. 在Java中插入Integral的最快方法是什麼?
- 17. ReadProcessMemory最快的方法是什麼?
- 18. 什麼是寫XML的最快方法
- 19. 什麼是從gfortran讀取.dbf文件的最簡單方法
- 20. 在.net中讀取串行端口的最快方法是什麼?
- 21. 什麼是從Java套接字讀取正確的方法?
- 22. 在Android中抓取HTML網頁的最快方法是什麼?
- 23. 在psd中提取圖像的最快方法是什麼?
- 24. 在java中讀取System.in的權限
- 25. 什麼是從IE中刪除DOM元素的最快方法?
- 26. 從POST到http servlet讀取xml的建議/最快的方式是什麼?
- 27. 在Java中逐行讀取文件的最快方法
- 28. 在Java中逐行讀取文本文件的最快方法
- 29. 在java中讀取大文件的最快方法
- 30. 在Java中搜索堆棧中最大元素的最快方法是什麼?
可能的重複[從Java文件中讀取大量數據](http:// stackoverflow。com/questions/2693223/read-large-of-data-from-file-in-java) – Crozin
你需要讀入每秒鐘多少百萬個整數?如果你有不到幾百萬的話,我不會擔心它太多。 –
我在編程比賽中遇到了這個問題。通常每個成千上萬的數字都會遇到數千個問題實例(以獲得一定的信心,您不會錯過複雜度較低的解決方案)。 – aioobe