Java 更新循环中的值

Java 更新循环中的值,java,Java,我无法更新下面代码中的错误。我已经包括了下面的两个类;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;

我无法更新下面代码中的
错误
。我已经包括了下面的两个类;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;
    }
}
循环中的
else
语句用于指定缺少哪些词性。我一直遇到的问题是
error
不会在
MadLib
中的
for
循环结束时更新。我尝试更改
error
的初始值来测试输出,它确实返回了
error
的测试值。如何在循环中更新
error


哇,我刚刚意识到我忘了澄清一些非常重要的事情。我应该能够在代码中输入多个句子,每次使用的名词/形容词/动词都会从列表中删除。如果在任何迭代过程中,这些词类中的任何一个对于整个句子来说都不够,那么它应该显示一条错误消息。错误消息是什么不起作用。

当您构造
MadLib
时,您添加了名词、动词和形容词。因此,
错误
更新的代码永远不会执行

更准确地说,以下表达式的计算结果始终为true:

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

因此,可能设置了
error
else
块永远不会被输入。

此代码非常冗长,如果您决定使用副词或其他内容,则很容易出现问题

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
s,您的代码就应该可以工作,因为大小是以一为基础的。如果列表中没有项目,则大小将为0,因此您的大小写将为
If(nomnes.size()==0)

如果您想了解每行代码的作用,建议您在调试器中逐步查看代码。如果没有更改
error
变量,那么您的任何条件都不是
true
为什么要输入该代码块?您的容器都包含条目(名词、动词等)。如果添加
System.out.println(nounocount+“”+形容词count+“”+verbCount),它将打印什么内容在这一行之后
int verbCount=verbs.size()-1?我敢肯定它会打印
-1
。所以你所有的
if-else
都是假的,因为它们从来都不等于0。@Frakcool这是否意味着我应该删除所有
计数的-1
?@EruIlúvatar是否打印了
-1
?如果是这样,那么是的,您应该删除它或将
If
条件更改为
,这样才有意义,但是(我希望)我调用了
MadLib
类两次;一次启动prog,一次运行
语句
@EruIlúvatar我不确定我是否遵循了。“调用
MadLib
类两次”是什么意思?建造它?如果是这样,它将以相同的方式运行两次。我启动
prog
一次,然后调用
语句一次。抱歉,如果我没有澄清
句子
是一个方法,而不是一个类。你可以叫它很多次。最终,您的一个容器(名词、形容词、动词)应该是空的,
error
将开始使用。但是你需要打好几次电话。
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));