Чтение ввода в Java - PullRequest
       17

Чтение ввода в Java

1 голос
/ 04 сентября 2011

У меня есть два типа входных данных

a b c d e... 

Здесь a, b и т. Д. - значения, которые нужно прочитать.Все они имеют одинаковые типы данных, которые могут быть короткими, целыми, длинными, двойными.Все значения разделены одним или несколькими пробелами.Мы дали их в одной строке, и мы не знаем, сколько их там.Ввод заканчивается переводом строки.Во втором случае нам присваивается число в качестве первой переменной «n», а затем следуют n переменных.например, для n = 5 это выглядит следующим образом.

n a b c d e

Это может быть сделано со сканером, но я слышал, что чтение ввода со сканера медленнее, чем метод bufferedReader.Я ищу любой возможный способ сделать это, кроме использования класса Scanner.Я новичок в Java.Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

Я бы получил что-то, что работает в первую очередь.Если у вас есть понимание узкого места, только тогда стоит попытаться его оптимизировать.

Чтобы ответить на ваш вопрос, ИМХО, самый быстрый способ прочитать данные - это использовать отображенный в память файл и проанализировать ByteBuffer.Предполагая, что у вас есть ASCII 8-битные байтовые данные (разумное предположение для чисел), избегая вообще использовать встроенные парсеры.Это будет намного быстрее, но и намного сложнее и полнее.;)

Если вам нужны примеры того, как анализировать числа прямо из ByteBuffer Низкий уровень Java: преобразование между целыми числами и текстом (часть 1) Для ускорения можно использовать класс Unsafe,но это не стандартная Java.

1 голос
/ 04 сентября 2011

Особенно, когда вы новичок в языке или среде, я бы предложил начать с чего-то понятного, но функционального, например

 String inputline = "n a b c d e";
 // Obtain real inputline eg by reading it from a file via a reader
 inputline = someBufferedReaderDefinedElsewhere.readLine();
 String[] parts = inputline.split(" ");

 // easiest for case 1
 for (String part : parts) {
     ...
 }

 // easiest for case 2
 int numberToRead = Integer.parseInt(parts[0]);
 // not < but <= because you start reading at element 1
 for (int ii=1;ii<=numberToRead;ii++) {
      ...
 }

Конечно, чтобы завершить со здоровой дозой проверки ошибок!

Впоследствии, если вы определите (с доказательством, например, выводом профилирования вашего приложения), что эта часть кода на самом деле ответственна за неоправданное потребление ЦП, вы можете начать думать о более быстром, более настраиваемомспособы чтения данных.Не наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...