2017-01-07 2 views
-2

Ich habe eine TXT-Datei, und ich muss jedes Element der Zeile (String, Leerzeichen) zu einem Array.Setzen jedes Element der Zeile zu einem Array in Java

Beispiel:

1 line "Hey, 1 Tag \ n"

2 /// etc

Ausgang für die erste Zeile: [ "H" "e" "y"“, "1" "d" "a" "y"]

Welcher Weg ist das am optimalsten? Mit Split und String oder vielleicht mit Char-Typ?

+5

können Sie nicht einfach 'string.toCharArray' verwenden – Moira

+0

Sie meinen, setzen Sie die ganze Zeile in eine Zeichenfolge und verwenden Sie diese Methode? – belab

+1

Ist das Problem beim Lesen der Datei? Oder die Zeichen der Zeichenfolge bekommen? – Tunaki

Antwort

2

Warum nicht einfach anrufen String#toCharArray auf der Zeichenfolge?

Leser werden Zeilenumbrüche abgeschnitten, wenn Sie trotzdem nextLine verwenden.

Etwas wie:

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: Beachten Sie, dass Sie eine Schleife durch die Zeichenfolge möchten String#charAt stattdessen verwenden, weil es nicht notwendig ist, das Zeichen-Array zu kopieren, vor allem für sehr große Strings.

Edit 2: Hier ist eine sehr schlechte Benchmark.

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."); 
} 

ich:

copy: 70984.336 ns 
loop: 40534.63 ns 

So, halb um so schnell. Ob Sie das als einen signifikanten Unterschied bezeichnen wollen oder nicht, werde ich Ihnen überlassen.

+0

Danke, ich werde es versuchen! – belab

Verwandte Themen