Есть ли более быстрый способ сделать это в Java?
Да. Сканер работает довольно медленно (по крайней мере, по моему опыту).
Если вам не нужно проверять ввод, я предлагаю вам просто обернуть поток в BufferedInputStream и использовать что-то вроде String.split
/ Integer.parseInt
.
Небольшое сравнение:
Чтение 17 мегабайт (4233600 номеров) с использованием этого кода
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
sum += scanner.nextInt();
взял на мою машину 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 секунды, но я думаю, что я ответил на ваш вопрос, и я не хочу превратить это в какой-то код гольф.