Как стать автором
Обновить

Быстрый ввод в Java

Время на прочтение4 мин
Количество просмотров8.2K
Доброго времени суток!
Данная статья будет полезна для прикладных программистов или людей, увлекающихся спортивным программированием. Она расскажет о быстром вводе данных на языке Java.

Я часто решаю задаче на сайте www.spoj.pl и иногда сталкиваюсь с проблемами скорости java. В основном это касается довольно медленного ввода данных, для некоторых задач не подходит даже StreamTokenizer.
С этой целью я написал класс, который побайтово считывает данные из потока и преобразует их в числа или строки. Как оказалось этот класс работает в несколько раз быстрее, чем scanf() в языке С++. Привожу его код ниже:
Copy Source | Copy HTML
  1. import java.io.DataInputStream;
  2. import java.io.InputStream;
  3.  
  4.  
  5. class Parser {
  6.     final private int BUFFER_SIZE = 1 << 16;
  7.     private DataInputStream din;
  8.     private byte[] buffer;
  9.     private int bufferPointer, bytesRead;
  10.  
  11.     public Parser(InputStream in) {
  12.             din = new DataInputStream(in);
  13.             buffer = new byte[BUFFER_SIZE];
  14.             bufferPointer = bytesRead =  0;
  15.     }
  16.     public String nextString(int maxSize) {
  17.         byte[] ch = new byte[maxSize];
  18.         int point =  0;
  19.         try {
  20.             byte c = read();
  21.             while (c == ' ' || c == '\n' || c=='\r')
  22.                 c = read();
  23.             while (c != ' ' && c != '\n' && c!='\r') {
  24.                 ch[point++] = c;
  25.                 c = read();
  26.             }
  27.         } catch (Exception e) {}
  28.         return new String(ch, 0,point);
  29.         }
  30.     public int nextInt() {
  31.     int ret =  0;
  32.     boolean neg;
  33.     try {
  34.         byte c = read();
  35.         while (c <= ' ')
  36.             c = read();
  37.         neg = c == '-';
  38.         if (neg)
  39.             c = read();
  40.         do {
  41.             ret = ret * 10 + c - '0';
  42.             c = read();
  43.         } while (c > ' ');
  44.  
  45.     if (neg) return -ret;
  46.     } catch (Exception e) {}
  47.     return ret;
  48.     }
  49.     public long nextLong() {
  50.         long ret =  0;
  51.         boolean neg;
  52.         try {
  53.             byte c = read();
  54.             while (c <= ' ')
  55.                 c = read();
  56.             neg = c == '-';
  57.             if (neg)
  58.                 c = read();
  59.             do {
  60.                 ret = ret * 10 + c - '0';
  61.                 c = read();
  62.             } while (c > ' ');
  63.  
  64.         if (neg) return -ret;
  65.         } catch (Exception e) {}
  66.         return ret;
  67.         }
  68.     private void fillBuffer() {
  69.         try {
  70.             bytesRead = din.read(buffer, bufferPointer =  0, BUFFER_SIZE);
  71.         } catch (Exception e) {}
  72.         if (bytesRead == -1) buffer[ 0] = -1;
  73.     }
  74.  
  75.     private byte read() {
  76.         if (bufferPointer == bytesRead) fillBuffer();
  77.         return buffer[bufferPointer++];
  78.     }
  79. }

Проверить или сравнить скорость ввода данных можно на задаче INTEST
Теги:
Хабы:
Всего голосов 38: ↑24 и ↓14+10
Комментарии21

Публикации

Ближайшие события