如何在Java中避免太多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

我有一个包含四个for循环的方法,正如您所看到的,每个循环都做相同的事情,这似乎是一种代码味道。 那么,有没有更好的方法让它变得更短更好呢

这是我的密码:

  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 如果一个包装类Vec2被用来同时包含x,y对,那么如果方向的定义被意外更改,您可以用一种不容易出现数组越界问题的方式来定义方向,因为编译器在编译时会强制执行这种方法


修改它来检查对角线方向也很容易,只需将对{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++)  {  
}