2015-12-14 144 views
0

我在更新下面的代碼中的error時遇到問題。我已經包括下面的兩個班級; MadLib類和MadLibRunner類。更新循環中的值

import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Random; 
import static java.lang.System.*; 
public class MadLib 
{ 
    ArrayList<String> nouns; 
    ArrayList<String> adjectives; 
    ArrayList<String> verbs; 
    public MadLib() 
    { 
     nouns = new ArrayList<String>(); 
     adjectives = new ArrayList<String>(); 
     verbs = new ArrayList<String>(); 
     nouns.add("dog"); 
     nouns.add("pig"); 
     nouns.add("chicken"); 
     nouns.add("building"); 
     nouns.add("car"); 
     nouns.add("person"); 
     nouns.add("place"); 
     nouns.add("thing"); 
     nouns.add("truck"); 
     nouns.add("city"); 
     nouns.add("state"); 
     nouns.add("school"); 
     nouns.add("student"); 
     nouns.add("bird"); 
     nouns.add("turkey"); 
     nouns.add("lion"); 
     nouns.add("tiger"); 
     nouns.add("alligator"); 
     nouns.add("elephant"); 
     adjectives.add("blue"); 
     adjectives.add("green"); 
     adjectives.add("orange"); 
     adjectives.add("fat"); 
     adjectives.add("skinny"); 
     adjectives.add("tall"); 
     adjectives.add("funny"); 
     adjectives.add("mad"); 
     adjectives.add("glad"); 
     adjectives.add("happy"); 
     adjectives.add("silly"); 
     adjectives.add("purple"); 
     adjectives.add("big"); 
     adjectives.add("little"); 
     adjectives.add("tiny"); 
     adjectives.add("huge"); 
     verbs.add("run"); 
     verbs.add("fly"); 
     verbs.add("skip"); 
     verbs.add("climb"); 
     verbs.add("clean"); 
     verbs.add("smell"); 
     verbs.add("eat"); 
     verbs.add("cry"); 
     verbs.add("smile"); 
     verbs.add("laugh"); 
     verbs.add("jump"); 
     verbs.add("crank"); 
     verbs.add("program"); 
    } 
    public String sentence (String statement) 
    { 
     String output = statement; 
     String word = ""; 
     Random rand = new Random(); 
     String error = ""; 
     for (int i = 0; i < output.length() - 1; i++) 
     { 
      if (nouns.size() > 0 && adjectives.size() > 0 && verbs.size() > 0) 
      { 
       if (output.charAt(i) == '#') 
       { 
        int random = rand.nextInt(nouns.size()); 
        word = nouns.get(random); 
        nouns.remove(random); 
        output = output.substring(0, i) + word + (output.substring(i + 1)); 
       } 
       else if (output.charAt(i) == '&') 
       { 
        int random = rand.nextInt(adjectives.size()); 
        word = adjectives.get(random); 
        adjectives.remove(random); 
        output = output.substring(0, i) + word + (output.substring(i + 1)); 
       } 
       else if (output.charAt(i) == '@') 
       { 
        int random = rand.nextInt(verbs.size()); 
        word = verbs.get(random); 
        verbs.remove(random); 
        output = output.substring(0, i) + word + (output.substring(i + 1)); 
       } 
      } 
      else 
      { 
       int nounCount = nouns.size() - 1; 
       int adjectiveCount = adjectives.size() - 1; 
       int verbCount = verbs.size() - 1; 
       if (nounCount == 0) 
       { 
        error = error + "Error: Not enough nouns."; 
       } 
       else if (adjectiveCount == 0) 
       { 
        error = error + "Error: Not enough adjectives."; 
       } 
       else if (verbCount == 0) 
       { 
        error = error + "Error: Not enough verbs."; 
       } 
       else if (nounCount == 0 && adjectiveCount == 0) 
       { 
        error = error + "Error: Not enough nouns and adjectives."; 
       } 
       else if (nounCount == 0 && verbCount == 0) 
       { 
        error = error + "Error: Not enough nouns and verbs."; 
       } 
       else if (adjectiveCount == 0 && verbCount == 0) 
       { 
        error = error + "Error: Not enough adjectives and verbs."; 
       } 
       else if (nounCount == 0 && adjectiveCount == 0 && verbCount == 0) 
       { 
        error = error + "Error: Not enough nouns, adjectives, and verbs."; 
       } 
       output = "Error: Not enough " + error; 
       break; 
      } 
     } 
     return output; 
    } 
} 

和轉輪類...

public class MadLibRunner 
{ 
    public static void main(String args[]) 
    { 
     boolean quit=false; 
     MadLib prog = new MadLib(); 
     do 
     { 
      out.println("Welcome to MadLibs!\n Please input your coded sentence, or end to exit: "); 
      Scanner in = new Scanner (System.in); 
      String statement = in.nextLine(); 
      if(statement.equals("end")) 
       quit=true; 
      else 
       out.println(prog.sentence(statement)); 
     }while(!quit); 
     out.println("\nThank you, goodbye.\n"); 
    } 
} 

在循環的else聲明的目的是指定哪些詞類失蹤。我一直得到的問題是error不會在的for循環末尾更新。我試着改變error的初始值來測試輸出,它確實返回了error的測試值。我如何在循環中更新error

哇,我只是意識到我忘了澄清一些非常重要的東西。我應該能夠在代碼中輸入多個句子,並且每次使用的名詞/形容詞/動詞都從列表中刪除。如果在任何迭代過程中整個句子的任何部分都沒有足夠的語音,那麼它應該顯示一條錯誤消息。錯誤消息是什麼不工作。

+1

如果您想了解每行代碼的作用,我建議您在調試器中逐步執行代碼。如果'error'變量沒有被改變,那麼你的條件都不是'true' –

+0

爲什麼它會進入該代碼塊?你的容器都包含條目(名詞,動詞等) – Nim

+0

如果你添加一個System.out.println(nounCount +「」+ adjectiveCount +「」+ verbCount);'this line後面'int verbCount =動詞.size() - 1;'?我很確定它打印'-1'。所以你所有的'if-else'都是假的,因爲它們不等於0. – Frakcool

回答

0

這段代碼很詳細,如果你決定要有副詞或其他東西,那麼這個代碼很容易出問題。

if (nounCount == 0) 
{ 
    error = error + "Error: Not enough nouns."; 
} 
else if (adjectiveCount == 0) 
{ 
    error = error + "Error: Not enough adjectives."; 
} 
else if (verbCount == 0) 
{ 
    error = error + "Error: Not enough verbs."; 
} 
else if (nounCount == 0 && adjectiveCount == 0) 
{ 
    error = error + "Error: Not enough nouns and adjectives."; 
} 
else if (nounCount == 0 && verbCount == 0) 
{ 
    error = error + "Error: Not enough nouns and verbs."; 
} 
else if (adjectiveCount == 0 && verbCount == 0) 
{ 
    error = error + "Error: Not enough adjectives and verbs."; 
} 
else if (nounCount == 0 && adjectiveCount == 0 && verbCount == 0) 
{ 
    error = error + "Error: Not enough nouns, adjectives, and verbs."; 
} 
output = "Error: Not enough " + error; 
break; 

我會重組的東西,讓你有你的檢查與替換代碼。

String replacement; 

if (output.charAt(i) == '#') 
{ 
    if (nouns.size() > 0) 
    { 
     int random = rand.nextInt(nouns.size()); 
     replacement = nouns.get(random); 
     nouns.remove(random); 
    } else { 
     return "Error: ran out of nouns"; 
    } 
} else if ... 

output = output.substring(0, i) + replacement+ (output.substring(i + 1)); 

這並不完美,但這種方式可以最大限度地減少特定錯誤情況下的數量。此外,如果句子中沒有形容詞替換,則不關心是否沒有形容詞。

在它的當前形式中,您的代碼應該在您啓動- 1後運行,因爲大小是基於一個的。如果列表中沒有項目,則大小將爲0,因此您的案例將是if (nouns.size() == 0)

0

當您構造MadLib時,您添加了名詞,動詞和形容詞。因此error被更新的代碼永遠不會執行。

更確切地說,下面的表達式始終計算爲真:

if (nouns.size() > 0 && adjectives.size() > 0 && verbs.size() > 0) 

因此永遠不會進入else塊,其中error可能設置。

+0

這將是有道理的,但(我希望)我調用MadLib類兩次;一次啓動編程,一次運行'語句'。 –

+0

@EruIlúvatar不確定關注。你是什​​麼意思「兩次調用MadLib類」?構建它?如果是這樣,那麼兩次操作都是一樣的。 – dave

+0

我啓動'prog'一次,然後調用'sentence'類一次。對不起,如果我沒有澄清, –