用于循环输出的Java不显示我想要的方式

Håv*_*sen 3 java

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

Adverbs Adjectives Nouns Verbs
Adverbs Adjectives Nouns Verbs
Adverbs Adjectives Nouns Verbs
Adverbs Adjectives Nouns Verbs
Run Code Online (Sandbox Code Playgroud)

这将创造一个毫无意义的诗......无论如何......我的问题是结果如下:

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);

}
}
Run Code Online (Sandbox Code Playgroud)

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

Adverb Adjective Noun Adjective(?!?!)
Adverb Adjective Noun Adjective(?!?!)
Adverb Adjective Noun Adjective(?!?!)
Adverb Adjective Noun Adjective(?!?!)
Run Code Online (Sandbox Code Playgroud)

动词在哪里?

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

Arn*_*lle 9

如果count%4==0那么count%2==0.因此,您永远不会达到相应的陈述.

if (count % 2 == 0) { 

} 

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

}
Run Code Online (Sandbox Code Playgroud)

你应该只使用一些模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;
}
Run Code Online (Sandbox Code Playgroud)

更进一步,使用StringBuilder而不是使用String 追加Strings也会更优雅,+=因为+=每次都会创建一个带有前两个的副本的新String.

示例:

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());
Run Code Online (Sandbox Code Playgroud)

再远一点,

正如@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");
}
Run Code Online (Sandbox Code Playgroud)