- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 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 编程的早期阶段。
最佳答案
如果 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");
}
关于Java for 循环输出不显示我想要的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19282182/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!