2017-01-07 2 views
-2

У меня есть txt-файл, и мне нужно поместить каждый элемент строки (строки, пробела) в массив.Ввод каждого элемента строки в массив в java

пример:

1 линия "Эй, 1 день \ п"

2 /// и т.д.

выход для первой строки: [ "Н" "е" "у"», "" "" "1" "d" "a" "y"]

Какой способ сделать это наиболее оптимальным? Использование split и string или, возможно, работающее с типом char?

+5

Вы не можете просто использовать 'string.toCharArray' – Moira

+0

Вы имеете в виду всю строку в строку, а затем использовать этот метод? – belab

+1

Является ли проблема с чтением файла? Или получить символы строки? – Tunaki

ответ

2

Почему бы не просто позвонить String#toCharArray на строку?

В любом случае читатели усекают символы перевода строки, если вы используете nextLine.

Что-то вроде:

try(BufferedReader r = new BufferedReader(new FileReader("topSecretDocs.txt"))) { 
    for(String line = r.readLine(); line != null; line = r.readLine()) { 
     char[] chars = line.toCharArray(); 
     System.out.println("Split line to " + Arrays.toString(chars)); 
    } 
} catch(IOException e) { 
    dealWithException(); 
} 

Edit: Обратите внимание, что вы можете цикла через строку, используя String#charAt вместо этого, потому что нет необходимости копировать массив символов, особенно для очень больших строк.

Редактировать 2: Вот очень плохой бенчмарк.

static long time(Runnable r) { 
    long start = System.nanoTime(); 
    r.run(); 
    return System.nanoTime() - start; 
} 

static int cs = 0; 

public static void main(String[] args) { 
    char[] bigString = new char[100000]; 
    Arrays.fill(bigString, 0, bigString.length/4, 'A'); 
    Arrays.fill(bigString, bigString.length/4, bigString.length/2, 'B'); 
    Arrays.fill(bigString, bigString.length/2, bigString.length * 3/4, 'C'); 
    Arrays.fill(bigString, bigString.length * 3/4, bigString.length, 'D'); 
    String s = new String(bigString); 
    float avgCopy = 0, avgLoop = 0; 
    final int times = 100000; 
    for(int i = 0; i < times; i++) { 
     avgLoop += time(() -> { 
      cs = 0; 
      for(int j = 0; j < s.length(); j++) 
       cs += s.charAt(j) == 'C' ? 1 : 0; 
     }); 
    } avgLoop /= times; 
    for(int i = 0; i < times; i++) { 
     avgCopy += time(() -> { 
      char[] chars = s.toCharArray(); 
      cs = 0; 
      for(char c : chars) 
       cs += c == 'C' ? 1 : 0; 
     }); 
    } avgCopy /= times; 
    System.out.println("copy: " + avgCopy + " ns"); 
    System.out.println("loop: " + avgLoop + " ns"); 
    System.out.println("There were (obviously) " + cs + " Cs in that string."); 
} 

я получаю:

copy: 70984.336 ns 
loop: 40534.63 ns 

Так, около половины так быстро. Независимо от того, хотите ли вы назвать это существенной разницей, я оставлю вас.

+0

Спасибо, я попробую! – belab