2013-03-06 12 views
6

Ich lese eine große Datei von der Festplatte. Diese Datei enthält nur Zahlen, die als einfaches altes ASCII codiert sind. Im Moment lese ich in Stücken, und dann so etwas wie dies zu tun:Schneller Weg, um eine byte [] Zeichenfolge zu seinem Integer Wert zu konvertieren

byte[] token; // bytes representing a bunch of numbers 
int n = Integer.parseInt(new String(token)); 

Mit anderen Worten, ich in einen String bin Umwandlung und dann den String in Integer-Parsing. Ich würde gerne wissen, ob es eine Möglichkeit gibt, schnelle Operationen wie Verschieben und Binärarithmetik anzuwenden?

Ich vermute, dass dies schneller gemacht werden könnte. Zum Beispiel sind die rohen Bytes für die Zahlen 1,2,3 49,50,51. Irgendwelche Ideen für Hacks?

+0

Wie werden die Zahlen in der Eingabedatei begrenzt? – Perception

+0

Hat es negative ganze Zahlen? – kuriouscoder

+0

@Perception: keine Notwendigkeit, darüber zu sorgen, habe ich bereits die Abgrenzung behandelt. Ich teile byte [] Chunks so schnell wie möglich. – Dave

Antwort

7
int n=0; 
    for(byte b : token) 
     n = 10*n + (b-'0'); 
+0

Wow, das ist gut :) Hängt aber von der Bestellung ab. –

+0

Wenn Sie einen Stream von ASCII-Zeichen lesen, ist die Reihenfolge bereits erledigt, oder ich vermisse etwas? – jdb

+0

Es gibt hier kein Endian-Problem. aber wird eine Kultur zuerst die niedrigste Ziffer schreiben? Sprich auf Arabisch, wir sehen Dinge wie 'عام 2013 هو عام جيد'. Wir wissen, dass Arabisch von rechts nach links geschrieben wird, also wird hier die arabische Zahl mit der niedrigsten Ziffer zuerst geschrieben? Keine Ahnung. – irreputable

2

Sie können Binärarithmetik nicht genau mit Basis 10 Zahlen, aber Sie können Dezimalarithmetik tun. Unter der Annahme, dass Stellen höherer Ordnung kommen zuerst:

byte[] token; 
long n = 0; 
long pow = 1; 
for(int i = token.length - 1; i >= 0; i--) { 
    n += (token[i]-48) * pow; 
    pow *= 10; 
} 
+0

Danke. Guter Punkt in der Dezimalrechnung. – Dave

0

versuchen

byte[] a = { 1, 2, 3 }; 
    for (int i = 0; i < a.length; i++) { 
     a[i] += '0'; 
    } 
    int n = Integer.parseInt(new String(a)); 
    System.out.println(n); 

Ausgang

123 
+0

Dies ist im Wesentlichen das gleiche wie mein ursprünglicher Ansatz. Ich wollte nicht den zusätzlichen Aufwand, neue Strings zu erstellen und sie dann zu Ints zu analysieren. – Dave

Verwandte Themen