2016-10-24 3 views
1

Probe getrennt: 1/2 3/4 5/6 7/8 9/10Wie in lesen und teilen eine Reihe von Zahlen durch Leerzeichen und Schrägstrich Eingang

Was ich erwarten, dass es zu tun: split zuerst Die Zeichenfolge basiert auf Leerzeichen. Sie erhalten also ein String-Array mit {1/2, 3/4, 5/6, 6/8, 9/10} und teilen dieses in ein Array mit ganzen Zahlen auf. intA {1, 2}, intB {3,4}, intC {5,6}, intD {7,8}, intE {9,10}, so dass ich sie schließlich in ein Bruchobjekt mit einem Zähler und einem Nenner übergeben kann. Hier

ist, was ich derzeit haben:

public static void main(String[]args) 
{ 
    Scanner keyboard = new Scanner(System.in); 
    String str; 
    str = keyboard.nextLine(); 
    String[] splitStr = str.split(" "); 

    Fraction[] input = new Fraction[10]; 

    for(int i = 0; i < splitStr.length; i++) 
    { 
     String[] fract = splitStr[i].split("/"); 
     int num = Integer.valueOf(fract[0]); 
     int den = Integer.valueOf(fract[1]); 
     double fraction = (double)num/den; 
    } 

    for(int i = 0; i < input.length; i++) 
    { 
     System.out.println(input[i]); 
    } 
} 

Wenn ich Eingabe der obigen Zeichenfolge, ich NULL-Werte zurück. Wenn ich irgendwelche Werte ohne Schrägstrich einfüge, so: 1/2 3/4 5/6 7 8 9/10 statt die 7 und 8 als 7/1 und 8/1 zu lesen, läuft das Programm in einen NullPointerException Fehler. Es muss einen einfacheren Weg geben, nicht wahr?

Antwort

4

ich NULL-Werte zurück

, weil Sie ist fügen Sie keine Werte an die input, Sie initialisieren es nur, die es mit null Werten füllen.

Ich bin mir nicht sicher, wie Sie Fraction Objekte erstellen, aber Sie müssen diese Art von Objekten erstellen und sie dem Array hinzufügen. Hier ein Beispiel:

Fraction[] input = new Fraction[10]; 

for(int i = 0; i < splitStr.length; i++) { 
    String[] fract = splitStr[i].split("/"); 
    int num = Integer.valueOf(fract[0]); 
    int den = Integer.valueOf(fract[1]); 
    input[i] = new Fraction(num, den); 
} 

Wenn Sie festlegen mögen die denominator-1, wenn der Eingang einzelne Zahlen enthält, können Sie etwas tun können:

for(int i = 0; i < splitStr.length; i++) { 
    String[] fract = splitStr[i].split("/"); 
    int num = Integer.valueOf(fract[0]); 
    int den = 1; 
    if(fract.length == 2){ 
     den = Integer.valueOf(fract[1]); 
    } 
    input[i] = new Fraction(num, den); 
} 

Auch ist es sicherer, die festlegen input Array-Länge gleich der splitStr Array-Länge.

Fraction[] input = new Fraction[splitStr.length]; 
+0

Vielen Dank! Ich habe es tatsächlich geschafft, die Brüche in das Array zu bringen, bevor ich Ihre Antwort sah, aber der Punkt, die Array-Länge "input" auf "splitStr" zu setzen, war hilfreich, ebenso wie die Eingabe einer ganzen Zahl. Ich denke, das ist ungefähr so ​​kompakt, wie Sie den Code in Java bekommen können. Ich fühlte mich in einem Meer von Indizes verloren. –

+0

Könnten Sie vielleicht erklären, was der praktische Unterschied zwischen 'Integer.parseInt()' und 'valueOf()' ist? –

+0

@AxelFinkel Details dazu finden Sie [HIER] (http://stackoverflow.com/questions/508665/difference-between-parseint-and-valueof-in-java). Normalerweise werden Listen anstelle von Arrays verwendet, die Größe einer Liste kann geändert werden und es ist einfacher, sie zu iterieren. – Titus

0

Für Zahlen ohne den (7 8) die Länge von fract überprüfen müssen:

String[] fract = splitStr[i].split("/"); 
int num = Integer.valueOf(fract[0]); 
int den = 1 
if(fract.length > 2) 
     den = Integer.valueOf(fract[1]); 
0
for(int i = 0; i < splitStr.length; i++) 
{ 
    // if statement works for 7 or 8 
    if(splitStr[i].length() == 1){ 
     // do something 

    } else if(splitStr[i].length() == 3){ 
     String[] fract = splitStr[i].split("/"); 
     int num = Integer.valueOf(fract[0]); 
     int den = Integer.valueOf(fract[1]); 
     double fraction = (double)num/den; 
    } 
} 
0

Sie einen regulären Ausdruck wie \s(\d+\/\d+)+ verwenden könnte, wenn die Zeichenfolge zusammengesetzt ist zu prüfen, Fraktionen und verwalten Sie die Situation entsprechend.

Verwandte Themen