2009-06-17 4 views
3

Beim Versuch, Facebooks Puzzle "Hoppity Hop", http://www.facebook.com/careers/puzzles.php?puzzle_id=7, aufzulösen, lese ich nur eine ganze Zahl aus einer Datei. Ich frage mich, ob dies der effizienteste Mechanismus ist, um dies zu tun?Das effizienteste Idiom nur eine ganze Zahl aus einer Datei zu lesen?

private static int readSoleInteger(String path) throws IOException { 
    BufferedReader buffer = null; 
    int integer = 0; 

    try { 
     String integerAsString = null; 

     buffer = new BufferedReader(new FileReader(path)); 

     // Read the first line only. 
     integerAsString = buffer.readLine(); 

     // Remove any surplus whitespace. 
     integerAsString = integerAsString.trim(); 

     integer = Integer.parseInt(integerAsString); 
    } finally { 
     buffer.close(); 
    } 

    return integer; 
} 

Ich habe How do I create a Java string from the contents of a file? gesehen, aber ich weiß nicht, die Effizienz der Sprache, die diese Frage beantwortet.

an meinem Code Blick scheint es, wie viele Zeilen Code und Objekte für ein triviales Problem ...

+0

Anstatt die gesamte Datei in einer Zeichenfolge zu lesen, wie die referenzierte Frage erfordert, wäre es besser, die Datei über die Datei "streamwise" zu scannen. Dies spart Speicher und vermeidet die Ineffizienz beim Lesen der gesamten Datei von der Festplatte und deren Decodierung. – erickson

+0

Könnten Sie bitte das für mich Erickson detailliert? –

+0

@erickson, sieht aus wie er liest nur bis zum Ende der ersten Zeile, nicht die ganze Datei –

Antwort

8

Die kürzeste Methode wäre mit einem Scanner:

private static int readSoleInteger(String path) { 
    Scanner s = new Scanner(new File(path)); 
    int ret = s.nextInt(); 
    s.close(); 
    return ret; 
} 

Beachten Sie, dass Scanner schluckt jede IOExceptions, damit vereinfacht sich vieles.

Wie für "am effizientesten" ... naja, der einfache Akt des Öffnens einer Datei von der Festplatte ist wahrscheinlich der langsamste Teil jeder Methode, die Sie dafür schreiben. Sorgen Sie sich in diesem Fall nicht zu sehr um die Effizienz.

Bearbeiten: Ich hatte nicht erkannt, dass die Ganzzahl Whitespace auf jeder Seite davon haben kann. Mein Code berücksichtigt dies derzeit nicht, aber es ist einfach, die Scannerskip things zu machen. Ich habe die Zeile

s.skip("\\s+"); 

hinzugefügt, um dies zu korrigieren.

Edit 2: Es macht nichts, ignoriert Scanner Leerzeichen, wenn es versucht, Zahlen zu analysieren:

Die Strings, die als Zahlen, die durch eine Instanz dieser Klasse analysiert werden kann in Bezug auf die folgenden regulären angegeben werden -Ausdruck Grammar:

(Regexes snipped)

Leer ist in den obigen regulären Ausdrücken nicht signifikant.

+0

Ich könnte die Leseleitung immer noch in eine try/finally-Klausel schreiben, da der Scanner laut der Dokumentation immer noch eine Ausnahme auslösen kann, wenn das erste Token keine Ganzzahl ist. –

+0

Und eine andere Ausnahme, wenn die Datei leer ist. Aber die Spezifikationen sagen, dass die Datei immer eine einzige ganze Zahl enthält; Fehlerbehandlung ist nicht Teil des Puzzles. –

+0

Mach dir keine Sorgen auf der Whiteseite, ich habe festgestellt, dass es funktioniert. –

4

ich die Scanner Klasse verwenden würde:

Scanner sc = new Scanner(new File("my_file")); 
int some_int = sc.nextInt();