如何在Java中避免太多For循环?
我有一个包含四个for循环的方法,正如您所看到的,每个循环都做相同的事情,这似乎是一种代码味道。 那么,有没有更好的方法让它变得更短更好呢 这是我的密码:如何在Java中避免太多For循环?,java,idioms,Java,Idioms,我有一个包含四个for循环的方法,正如您所看到的,每个循环都做相同的事情,这似乎是一种代码味道。 那么,有没有更好的方法让它变得更短更好呢 这是我的密码: void explodeDirections() { for (int i = 0; i < strength; i++) if (!explode(x+i, y)) break; for (int i = 0; i < strength; i++) if (!e
void explodeDirections() {
for (int i = 0; i < strength; i++)
if (!explode(x+i, y))
break;
for (int i = 0; i < strength; i++)
if (!explode(x, y+i))
break;
for (int i = 0; i < strength; i++)
if (!explode(x-i, y))
break;
for (int i = 0; i < strength; i++)
if (!explode(x, y-i))
break;
}
在为平铺网格编写代码时,这是一种非常常见的模式。要有效地处理它,您可以编写: 公共静态final int[][]方向={{1,0},{-1,0},{0,1},{0,-1}; 无效方向int x,int y,int强度{ 对于int[]dir:DIRECTIONS{ 对于int i=0;i
修改它来检查对角线方向也很容易,只需将对{1,1}、{-1,1}、{1,-1}和{-1,-1}添加到方向即可。如果方向检查的顺序无关紧要
void explodeDirections() {
for (int i = 0; i < strength; i++) {
if (!explode(x + i, y))
break;
if (!explode(x, y + i))
break;
if (!explode(x-i, y))
break;
if (!explode(x, y-i))
break;
}
}
原始代码在我看来很好。很清楚这意味着什么。一点也不臭 也许我会使用一个单循环终止条件,而不是两个;比如:
for (int i = 0; i < strength && !explode(x+i, y); i++) {
}
因为我更喜欢在简单的情况下避免跳出循环
但是对于我来说,4个循环来完成4件稍有不同的事情的存在似乎没有争议-可能比备选方案更清楚。使用或条件来缩短持续时间您没有保存在每种情况下中断的i的值,我假设爆炸调用可能有副作用,需要按显示的顺序调用?@Lowerer我猜这是游戏中瓷砖网格上的爆炸,爆炸在主要方向上以最大强度传播,直到爆炸返回false检测到每个方向上的某个东西。@hoapham是的,但问题是,如果其中任何一个陈述是真的,那么它将终止循环。@KeeleyHoek同意,但这只是猜测这在功能上并不等同于问题中给出的代码。在这里,任何中断都将终止循环,但原始代码只会中断特定方向上的每个单独循环检查。您必须删除!爆炸前,使其功能等效
void explodeDirections() {
for (int i = 0; i < strength; i++) {
if (!explode(x + i, y))
break;
if (!explode(x, y + i))
break;
if (!explode(x-i, y))
break;
if (!explode(x, y-i))
break;
}
}
for (int i = 0; i < strength && !explode(x+i, y); i++) {
}