Доброго времени суток!
Данная статья будет полезна для прикладных программистов или людей, увлекающихся спортивным программированием. Она расскажет о быстром вводе данных на языке Java.
Я часто решаю задаче на сайте www.spoj.pl и иногда сталкиваюсь с проблемами скорости java. В основном это касается довольно медленного ввода данных, для некоторых задач не подходит даже StreamTokenizer.
С этой целью я написал класс, который побайтово считывает данные из потока и преобразует их в числа или строки. Как оказалось этот класс работает в несколько раз быстрее, чем scanf() в языке С++. Привожу его код ниже:
Проверить или сравнить скорость ввода данных можно на задаче INTEST
Данная статья будет полезна для прикладных программистов или людей, увлекающихся спортивным программированием. Она расскажет о быстром вводе данных на языке Java.
Я часто решаю задаче на сайте www.spoj.pl и иногда сталкиваюсь с проблемами скорости java. В основном это касается довольно медленного ввода данных, для некоторых задач не подходит даже StreamTokenizer.
С этой целью я написал класс, который побайтово считывает данные из потока и преобразует их в числа или строки. Как оказалось этот класс работает в несколько раз быстрее, чем scanf() в языке С++. Привожу его код ниже:
Copy Source | Copy HTML
- import java.io.DataInputStream;
- import java.io.InputStream;
-
-
- class Parser {
- final private int BUFFER_SIZE = 1 << 16;
- private DataInputStream din;
- private byte[] buffer;
- private int bufferPointer, bytesRead;
-
- public Parser(InputStream in) {
- din = new DataInputStream(in);
- buffer = new byte[BUFFER_SIZE];
- bufferPointer = bytesRead = 0;
- }
- public String nextString(int maxSize) {
- byte[] ch = new byte[maxSize];
- int point = 0;
- try {
- byte c = read();
- while (c == ' ' || c == '\n' || c=='\r')
- c = read();
- while (c != ' ' && c != '\n' && c!='\r') {
- ch[point++] = c;
- c = read();
- }
- } catch (Exception e) {}
- return new String(ch, 0,point);
- }
- public int nextInt() {
- int ret = 0;
- boolean neg;
- try {
- byte c = read();
- while (c <= ' ')
- c = read();
- neg = c == '-';
- if (neg)
- c = read();
- do {
- ret = ret * 10 + c - '0';
- c = read();
- } while (c > ' ');
-
- if (neg) return -ret;
- } catch (Exception e) {}
- return ret;
- }
- public long nextLong() {
- long ret = 0;
- boolean neg;
- try {
- byte c = read();
- while (c <= ' ')
- c = read();
- neg = c == '-';
- if (neg)
- c = read();
- do {
- ret = ret * 10 + c - '0';
- c = read();
- } while (c > ' ');
-
- if (neg) return -ret;
- } catch (Exception e) {}
- return ret;
- }
- private void fillBuffer() {
- try {
- bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
- } catch (Exception e) {}
- if (bytesRead == -1) buffer[ 0] = -1;
- }
-
- private byte read() {
- if (bufferPointer == bytesRead) fillBuffer();
- return buffer[bufferPointer++];
- }
- }
Проверить или сравнить скорость ввода данных можно на задаче INTEST