我试图创建一个循环,它只迭代我所拥有的列表的一部分,但列表有时只放入一个或两个项目。我的目标是让它打印不超过3个结果,无论循环内有多少项。
if (event.getMessage().getContent().startsWith("!!")) {
for (int i=0; i<allMatches.size(); i++) {
event.getTextChannel().sendMessage((i+1)+".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ")
.replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue();
}
}
else {
for (int i=0; i<3; i++) {
event.getTextChannel().sendMessage((i+1)+".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ")
.replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue();
}
}
据我所知,当列表中只有1或2个项目时,越界错误来自i&lt; 3,但循环仍在继续。我尝试了各种各样的东西,但我不太确定如何正确地做到这一点。
感谢。
答案 0 :(得分:2)
您可以使用Stream API来解决此问题:
AtomicInteger num = new AtomicInteger(1);// use this for string number
allMatches.stream().limit(3).forEach(value -> event.getTextChannel()
.sendMessage(num.getAndIncrement()+".\\)"+value.replace("\"", "")
.replace(",", "; ").replace("[", " ")
.replace("]", "").replace("english_definitions:", "")).queue()
);
使用限制方法,您可以只迭代thrue所需的值数,如果列表的大小较小,您将不会遇到任何问题。
答案 1 :(得分:1)
如果我理解正确,你只想打印较小的3和大小的次数?您可以在循环之前计算该数字,这样您只需要一个for循环:
if (event.getMessage().getContent().startsWith("!!")) {
for (int i = 0; i < allMatches.size(); i++) {
event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ")
.replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue();
}
} else {
for (int i = 0; i < Math.min(3, allMatches.size()); i++) {
event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ")
.replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue();
}
}
我更改了for循环声明(假设第二个是你需要帮助的那个?):
for (int i = 0; i < Math.min(3, allMatches.size()); i++)
现在它将运行3次或allMatches.size()
次,以较小者为准。
减少重复代码量的另一个优化是计算循环次数,在for循环之外,只有1个循环:
int loops = Math.min(3, allMatches.size());
if (event.getMessage().getContent().startsWith("!!"))
loops = allMatches.size();
for (int i = 0; i < loops; i++) {
event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ")
.replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue();
}
为了可读性和调试而减少重复代码总是一个好主意,因为看起来你的循环都做同样的事情,最好像我上面那样重构你的代码以避免重复的代码。
答案 2 :(得分:-1)
在第二个循环中添加一个if子句。
if(allMatches.size()==i)break;