2013-12-11 260 views
0

我想創建一個循環,用戶輸入比薩餅澆頭的一些值。他們可以吃意大利辣香腸,菠蘿等。當他們鍵入「完成」時,我希望它跳出循​​環。我有這一切工作。它只是我的循環,這是問題。我有4個比薩餅頂部,所以我自然而然地把它放在4次左右。但是,如果用戶輸入了錯誤的值,那會使用我的4個循環中的一個。現在我可以將櫃檯設置爲200,所以他們不可能多次錯誤。但我希望有一個更清潔的版本。所以它會一直提示用戶,直到輸入「done」。我嘗試使用一個while循環,同時嵌套在do-while中。類似於For循環問題

while(size != "done") 

但是這也沒有效果。祂我的代碼:

public List<String> Input(){ 
    List<String> toppings = new ArrayList<String>(); 
    Scanner sc = new Scanner(System.in); 
    String size; 

    System.out.println("What pizza toppings; Pepperoni, Fungi, Pineapple or Bacon, type 'done' when your finished: "); 

FORLOOP: for(int i = 0; i < 4 ; i++){ 

    do { 
     size = sc.next(); 
     if (size.equalsIgnoreCase("Pepperoni") || size.equalsIgnoreCase("Fungi") || size.equalsIgnoreCase("pineapple") || size.equalsIgnoreCase("bacon")) { 
      toppings.add(size); 
     } else if(size.equalsIgnoreCase("done")){ 

      break FORLOOP; 
     } 
     else{ 
      System.out.print("Choose either 'Pepperoni', 'Fungi', 'bacon' or 'pineapple' Toppings, type 'done' when finshed: "); 

     } 
    } while (false); 

    } 
    return toppings; 
} 
+2

「沒有工作」。爲什麼不?這應該。 – Nanne

+0

我在輸入了大約6個錯誤的值 –

+0

後,我有一個計算器,當一個SO帶你到達SO時。 –

回答

1
int cnt = 0; 

while(cnt < 4){ 
    size = sc.next(); 
    if (size.equalsIgnoreCase("Pepperoni") || size.equalsIgnoreCase("Fungi") || size.equalsIgnoreCase("pineapple") || size.equalsIgnoreCase("bacon")) { 
     toppings.add(size); 
     cnt++; 
    } else if(size.equalsIgnoreCase("done")){ 
     break; 
    } 
    else{ 
     System.out.print("Choose either 'Pepperoni', 'Fungi', 'bacon' or 'pineapple' Toppings, type 'done' when finshed: "); 
    } 
} 
1

這樣的事情?

while (toppings.size() < 4){ 
    size = sc.next(); 
    if (size.equalsIgnoreCase("Pepperoni") || size.equalsIgnoreCase("Fungi") || size.equalsIgnoreCase("pineapple") || size.equalsIgnoreCase("bacon")) { 
     toppings.add(size); 
    } 
    else if(size.equalsIgnoreCase("done")) 
    { 
     break; //single depth. just break the while 
    } 
    else 
    { 
     System.out.print("Choose either 'Pepperoni', 'Fungi', 'bacon' or 'pineapple' Toppings, type 'done' when finshed: "); 

    } 
} 

加歇「做」自己,但對象是明確的。 *只是讓你真正需要保護的東西。就像我在這裏做了數組列表的大小。您可以使用計數,如果你得到「流氓,不重新檢查循環中的大小」振動:))

*增加了突破。

+0

所以它循環,直到4澆頭(它可以是4倍的培根)被選中...'完成'的休息在哪裏? –

+0

這不是讓代碼更簡單,你可以自己添加它(我想),但我可以爲你添加它,如果你想。不應該太多,雖然... – Nanne

+0

增加了'完成'你的休息 – Nanne

0

根本不需要外部for循環或FORLOOP標籤。然後,只需將while條件更改爲true,以便它將永久循環,直到用戶輸入「完成」時明確break;。其實,而不是break ing,你可以簡單地return toppings在那一點。

如果你擔心在同一個體貼用戶輸入兩次,然後要麼把澆頭在Set - LinkedHashSet將維持秩序 - 而不是List,或添加size到前檢查!toppings.contains(size)名單。順便提一下,爲清晰起見,您可能需要將size重命名爲topping

0
bool wantMoreToppings = true; 
bool shouldTakeMoreToppings = true; 
while(wantMoreToppings && shouldTakeMoreToppings) 
{ 
    String newTopping = sc.next(); 
    if (newTopping.equalsIgnoreCase("Pepperoni") || 
     newTopping.equalsIgnoreCase("Fungi") || 
     newTopping.equalsIgnoreCase("pineapple") || 
     newTopping.equalsIgnoreCase("bacon")) 
    { 
     if(!toppings.contains(newTopping))//change this if you allow double toppings 
     { 
      toppings.add(newTopping); 
     } 
    } 
    else 
    { 
     wantMoreToppings = !newTopping.equalsIgnoreCase("done") 
    } 
    shouldTakeMoreToppings = toppings.size() < 4;//change this if you allow double toppings toppings 
}