越界异常
我正在尝试创建一个循环,它只能遍历列表的一部分,但列表有时只有一个或两个项目放入它。无论循环中有多少物品,我的目标是打印不超过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();
}
}
据我所知,出界失误从我< 3来当列表只中有1个或2项,但循环不断去反正。我尝试了各种各样的东西,但我不太清楚如何正确地做到这一点。
谢谢。
如果我正确理解你,你只是想打印3和尺寸的较小的次数?你可以计算出之前,你的循环,即号码,这样你只需要一个for循环,而不是:(?假设2号上的是你需要帮助的)
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 (int i = 0; i < Math.min(3, allMatches.size()); i++)
所以现在它会运行3或allMatches.size()
次数,以较小者为准。
另一种优化,以减少重复的代码量是计算的时间循环次数,您之外循环,并只有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();
}
它始终是一个好主意为了减少重复代码的可读性和调试性,并且由于它们看起来都是循环执行相同的事情,所以最好像上面所做的那样重构代码以避免重复的代码。
在第二个循环中添加一个if子句。
if(allMatches.size()==i)break;
您可以使用流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只需要值的数量,如果列表的大小不,你不会得到任何问题。
还请添加一些解释,而不仅仅是一堆代码行。按照目前的形式,这对OP来说并不是非常有帮助,因为它可以理解这个问题,为什么这是一个解决方案。 – Zabuza
欢迎来到Stack Overflow!它看起来像你需要学习使用调试器。请帮助你一些补充性的调试技术。如果您之后仍然遇到问题,请随时返回一个显示您的问题的[最小化,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –