2017-04-24 1 views
1

Ich möchte "numberOfItems" als eine große Zahl festlegen, aber die Schleife in der Mitte anhalten. Ich brauche Hilfe für den Teil der Zeit. Keine ArrayList, bitte, das ist mir noch nicht bekannt.Wie verwende ich "stop" als Schlüsselwort, um die for-Schleife zu stoppen?

do 
{ 
    for(int i=0; i<=numberOfItems; i++) 
    { 
     System.out.println("Enter product name"); 
     productName[i]=input.nextLine(); 
     System.out.println("Enter price of product"); 
     productPrice[i]=input.nextDouble(); 
     System.out.printf("%s,%n,%.2f",productName[i],productPrice[i]); 
    } 
} 
while (! (productName[i]= input.nextLine("stop"))); 
+1

Verwenden 'break' wo immer Sie aus der Schleife kommen wollen. – yogidilip

+0

Brauchen Sie die break-Anweisung? https://www.tutorialspoint.com/java/java_break_statement.htm – user3685285

+0

Sie haben zwei Schleifen, welche möchten Sie stoppen? – Adam

Antwort

1

Betrachtet man, wie Ihr Code funktioniert, die vernünftigste Ort ist wahrscheinlich zu brechen, nachdem sie einen Produktnamen eingeben. Dies würde bedeuten, dass Sie kein STOP-Produkt speichern können ... Ich habe das als GROSSBUCHSTABEN gelassen (Sie können equalsIgnoreCase verwenden, wenn Sie sich nicht für den Fall interessieren).

Etwas wie folgt aus:

for(int i=0; i<=numberOfItems; i++) 
    { 
     System.out.println("Enter product name (or STOP to stop)"); 
     String tmpProduct = input.nextLine(); 

     //trim to avoid whitespace 
     if ("STOP".equals(tmpProduct.trim())) { 
      break; //we stop the loop here 
     } 

     //they didn't type STOP, guess they wanted a product. 
     productName[i]=tmpProduct; 


     System.out.println("Enter price of product"); 
     productPrice[i]=input.nextDouble(); 
     System.out.printf("%s,%n,%.2f",productName[i],productPrice[i]); 
    } 

Dies vermeidet auch die Notwendigkeit für die äußere Schleife. Wenn Sie lieber nach jedem Produkt fragen (das könnte nach einer Weile ärgerlich werden), dann können Sie den Scheck einreichen und nach dem Anfordern des Doppelten fragen.

for(int i=0; i<=numberOfItems; i++) 
    { 
     System.out.println("Enter product name"); 

     //they didn't type STOP, guess they wanted a product. 
     productName[i]=input.nextLine(); 

     System.out.println("Enter price of product"); 
     productPrice[i]=input.nextDouble(); 
     System.out.printf("%s,%n,%.2f",productName[i],productPrice[i]); 

     System.out.println("type STOP to stop or anything else to continue"); 
     String tmp = input.nextLine(); 
     //trim to avoid whitespace problems 
     if ("STOP".equals(tmp.trim())) { 
      break; //we stop the loop here 
     } 
    } 
+1

vielen dank! –

+0

Deshalb habe ich beide Loops zur Verfügung gestellt - bitte erkläre, wie das Programm leicht abstürzen kann - die einzige Möglichkeit, das passiert jetzt auf ungültigen Input - das Einfangen der Ausnahme würde dies verhindern, aber das war nicht das, wonach der Fragesteller gefragt hat. Wenn Sie ein solches Beispiel geben können, werde ich meine Antwort gerne ändern. Es gibt ** genau ** zwei Möglichkeiten (keine abnormale Beendigung), um jede Schleife zu beenden, wie in meiner Antwort dokumentiert. – WebPigeon

+0

Übrigens, nextDouble() liest nicht bis zum newLine-Zeichen, so dass es nach der ersten Schleife alles durcheinander bringt. Beim nächsten Mal versuchen Sie bitte, Ihren Code vor dem Senden auszuführen! – Yahya

2

Sie können in Ihrer for Schleife eine if Anweisung setzen, um zu entscheiden, wenn es zu stoppen; Die Anweisung zum Stoppen einer Schleife lautet break.

Beachten Sie, dass dies bedeutet, dass Sie die umgebende do Schleife nicht benötigen.

0

UPDATE Diese Antwort verstärkt wird ausführlich erklärt

// this method to validate the input after reading the entire line 
static public Object interpretedInput(String line){ 
    if(line.replace(" ", "").equalsIgnoreCase("stop")){ // if stop detected 
     return null; 
    } 
    else {// if it's not stop 
     for(char c : line.toCharArray()){ // read every char in the line 
      if(!Character.isDigit(c) && c!='.'){ // if any non digit is detected that means it should be considered as a string 
       //(note if you want the product name to consist of digits only -> this won't work) 
       return line; // return line 
      } 
     } 
    } 
    try{return Double.valueOf(line);} // else try to parse the line to extract the double value and return it 
    catch(NumberFormatException e){return null;} 
} 


Scanner input = new Scanner(System.in); 
int numberOfItems = 10; // for example 
String[]productName = new String[10]; 
double[] productPrice = new double[10]; 
for(int i=0; i<numberOfItems; i++){ 
    System.out.println("Enter product name"); 
    Object theInput = interpretedInput(input.nextLine()); // the method will return either null or string or double 
    if(theInput==null){ // if it's null that means to stop 
     break; 
    } 
    else if (theInput instanceof String){ // if it's instance of string accept it 
      productName[i]=(String)theInput; 
    } 
    while(!(theInput instanceof Double)){ // this will repeat until a valid double input is entered 
     //then it will assign it and display the content 
     System.out.println("Enter price of product"); 
     theInput = interpretedInput(input.nextLine()); 
     if(theInput==null){ 
       i=numberOfItems; // to terminate the parent for loop as well 
       break; 
     } 
     else if (theInput instanceof Double){ 
      productPrice[i]=(Double)theInput; 
      System.out.printf("%s, %.2f\n",productName[i],productPrice[i]); 
     } 
     else{System.out.println("Invalid Price");} 
    } 
} 
Verwandte Themen