2014-10-20 2 views
0

У меня есть этот код:Быстрый способ чтения конкретных данных в Java

System.setIn(new FileInputStream(System.getProperty("user.dir") + "/src/one.in")); 
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 

for (i = 0; i < ...; i++) { 
     String line = reader.readLine(); 
     String firstLocation = line.substring(0, line.indexOf(' ')); 
     String mid = line.substring(line.indexOf(' '), line.lastIndexOf(' ')).trim(); 
     String secondLocation = line.substring(line.lastIndexOf(' ') + 1); 
     .... 
} 

и я читал много строк вида:

A --875-> B 
A <-854-- B 
A --713-> B 
A <-908-- B 
A --925-> B 
A <-894-- B 
A --239-> B 
A <-30-- B 
A --802-> B 

Есть ли быстрый способ читать и обрабатывать эти строки ? Я также пробовал читать все строки в одном и том же расписании с использованием символа конца строки, но он работает еще медленнее.

+0

Я бы, вероятно, использовал 'line.split (" ")', но вопрос в том, что вы делаете что-то еще в этом цикле, что может вызвать медленность. – RealSkeptic

ответ

0
String[] parts = line.split(" "); 
String firstLocation = parts[0]; 
String mid = parts[1]; 
String secondLocation = parts[2]; 
1

Самый быстрый способ, который я знаю, это использовать StringTokenizer. Тогда ваш код будет выглядеть следующим образом:

System.setIn(new FileInputStream(System.getProperty("user.dir") "/src/one.in")); 
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 

while (reader.ready()) { 
    final StringTokenizer tk = new StringTokenizer(reader.readLine()," "); 
    String first = tk.nextToken(); 
    String second = tk.nextToken(); 
    String third = tk.nextToken(); 
    ... 
} 

Я не хотел бы проверить здесь, если есть достаточно лексемы доступна, Beause вы знаете й структуру вас входная строка, что также экономит время. Как вы можете видеть here, StringTokenizer работает быстрее, чем с помощью метода Pattern или split(...).

+0

Из документов: «StringTokenizer - это унаследованный класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы каждый, кто ищет эту функцию, использовал метод split для String или пакет java.util.regex. " – weston

+0

Это правда, но он попросил производительность не для совместимости :-) – Westranger

+0

Но +1 для поиска доказательств того, что он быстрее в аналогичном случае. – weston

0

Это лучше, если вы разрабатываете свой метод и сохранить его в виде библиотеки (или даже в качестве шаблона в качестве IDE!) Например, если вы хотите прочитать целое число от System.in, вы можете использовать эту функцию

static int readInt(BufferedInputStream b) throws IOException { 
    String s = ""; 
    int x = b.read(); 
    while (x < 48 || x > 57) { 
     x = b.read(); 
    } 
    while (x >= 48 && x <= 57) { 
     s = s + (char) x; 
     x = b.read(); 
    } 
    return Integer.parseInt(s); 
} 

Этот метод предоставит вам следующее доступное целое число на входе. Этот метод игнорирует любой нечисловой символ.

Например, если ваш вход будет как:

" 123 [email protected]@b" 

выход будет только

123 

Важной частью является то, что этот метод делает роль nextInt() в сканере, но, как быстрее первого.

Смежные вопросы