3

我对 Java 编码非常陌生,并且在过去几个小时里一直困扰着我。我正在创建一个非常小而简单的应用程序,它将生成一首诗。我有四个带有“名词”、“动词”、“形容词”和“副词”的 ArrayList。这首诗将从每个列表中取出一个单词并将其组合成一首四行诗,每个列表中每行一个单词,如下所示:

Adverbs Adjectives Nouns Verbs
Adverbs Adjectives Nouns Verbs
Adverbs Adjectives Nouns Verbs
Adverbs Adjectives Nouns Verbs

这将创建一首毫无意义的诗......无论如何......我的问题是结果看起来像这样:

public void generatePoem() {
    adjectives.add("adjective1");
    adjectives.add("adjective2");
    adjective.add("adjective3");
    adjective.add("adjective4");
    nouns.add("noun1");
    nouns.add("noun2");
    nouns.add("noun3");
    nouns.add("noun4");
    verbs.add("verb1");
    verbs.add("verb2");
    verbs.add("verb3");
    verbs.add("verb4");
    adverbs.add("adverb1");
    adverbs.add("adverb2");
    adverbs.add("adverb3");
    adverbs.add("adverb4");



    String thepoem = ""; 


        for (int i=0;i<16;i++) { 
            int count = i + 1; 
            int random = (int)(Math.random()*4);



                    if (count % 2 == 0) { 
                        thepoem += adjectives.get(random).toString() + " "; 
                    } 
                    else if (count % 3 == 0) { 
                        thepoem += nouns.get(random).toString() + " ";
                    } 
                    else if (count % 4 == 0) {
                        thepoem += verbs.get(random).toString() + "\n"; 
                    } 
                    else { 
                        thepoem += adverbs.get(random).toString() + " ";
                    }



        }

        JOptionPane.showMessageDialog(null, thepoem);

}
}

结果是随机的,但总是这样:

Adverb Adjective Noun Adjective(?!?!)
Adverb Adjective Noun Adjective(?!?!)
Adverb Adjective Noun Adjective(?!?!)
Adverb Adjective Noun Adjective(?!?!)

动词在哪里?

我似乎无法找到解决方案...有人请帮助我吗?同样,我仍处于 Java 编程的早期阶段。

4

6 回答 6

9

如果count%4==0那么count%2==0. 因此,您将永远无法达到相应的声明。

if (count % 2 == 0) { 

} 

else if (count % 4 == 0) { // <-- You will never reach this statement.

}

您应该只使用一些模 4。它允许您使用 switch 语句。

switch (count % 4) {
  case 0 : 
    thepoem += verbs.get(random).toString() + "\n";
    break;
  case 1 :
    thepoem += adverbs.get(random).toString() + " ";
    break;
  case 2 :
    thepoem += adjectives.get(random).toString() + " ";
    break;
  case 3 :
    thepoem += nouns.get(random).toString() + " ";
    break;
}

更进一步,使用StringBuilder附加字符串也会更优雅,而不是使用+=,因为+=每次都会创建一个新字符串,其中包含前两个字符串的副本。

例子 :

StringBuilder sb = new StringBuilder();

for (int i=0;i<16;i++) {
  ...

switch (count % 4) {
  case 0 : 
    sb.append(verbs.get(random).toString() + "\n");
    break;
  case 1 :
    sb.append(adverbs.get(random).toString() + " ");
    break;

  ....
  JOptionPane.showMessageDialog(null, sb.toString());

再远一点

正如@IanMcLaird 所指出的,您也可以(实际上,您真的应该)完全不使用模数(请参阅评论和 IanMcLaird 的回答)。

如果我将 IanMcLaird 的答案与 StringBuilder 结合起来,最好的解决方案是恕我直言:

StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 4; ++i) {
  sb.append(adverbs.get(random.nextInt(4)) + " ");
  sb.append(adjectives.get(random.nextInt(4)) + " ");
  sb.append(nouns.get((random.nextInt(4)) + " ");
  sb.append(verbs.get((random.nextInt(4)) + "\n");
}
于 2013-10-09T20:41:12.063 回答
1

如果 count 的值为 4,则 4%2 == 0 返回 true。这就是为什么你得到形容词而不是副词的原因。

于 2013-10-09T20:45:58.327 回答
1

或者,您可以逐行迭代而不使用模。此外,创建一个真正的随机生成器以获得更真实的随机结果。

Random random = new Random();
for (int i = 0; i < 4; ++i) {
    thePoem += adverbs.get(random.nextInt(4)) + " ";
    thePoem += adjectives.get(random.nextInt(4)) + " ";
    thePoem += nouns.get((random.nextInt(4)) + " ";
    thePoem += verbs.get((random.nextInt(4)) + "\n";
}
于 2013-10-09T20:55:45.187 回答
0

任何匹配你的动词 (count%4) 的东西也将匹配你的形容词条件 (count%2)

于 2013-10-09T20:41:57.330 回答
0

任何能被 4 整除的东西总是能被 2 整除,所以你的代码永远不会达到被 4 整除的条件,因此没有动词。一种解决方法是交换此检查,即您首先检查它是否可被 4 整除,然后检查它是否可被 2 整除

于 2013-10-09T20:42:19.743 回答
0

更改此行:

if (count % 2 == 0)

至:

if (count % 2 == 0 && count % 4 != 0)

看看你是否得到了正确的结果。

于 2013-10-09T20:47:39.653 回答