2015-12-14 140 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'类一次。对不起,如果我没有澄清, –