使用大量if语句缩短while循环

时间:2017-02-06 17:38:22

标签: java

我有以下代码:

while (something < something) {
        array2.clear();
        }
    }

如何缩短此循环,似乎非常重复,尤其是前4个if语句。我应该使用switch语句吗?如果是这样,你能用一个我的if语句给我一个例子。

2 个答案:

答案 0 :(得分:1)

我会使用带枚举的循环

enum Direction {
    NORTH(0, +1), SOUTH(0, -1), EAST(+1, 0), WEST(-1, 0);
    public final int x, y;
    Direction(int x, int y) { this.x = x; this.y = y; }
}

然后你可以按随机顺序循环它们

List<Direction> dirs = Arrays.asList(Direction.values());
while (visitedCells < totalCells) {
    Collection.shuffle(dirs);
    boolean found = false;
    for (Direction dir : dirs) {
       int x2 = x + dir.x;
       int y2 = y + dir.y;
       if (0 <= x2 && x2 < sizeX && 0 <= y2 && y2 < sizeT && cells[x2][y2].checkWalls()) {

           visitedCells++;
           found = true;
           break;
       }
    }
    if (!found) {

    }
}

答案 1 :(得分:0)

在这种情况下使用switch语句会很困难。这可能不受欢迎,但我会把它保留原样。是的,有一些重复,这并不理想,但似乎不值得重构,特别是考虑到你在每个if语句中所做的细微差别以及不止一个的可能性如果声明 - 或者没有声明 - 可以触发。尝试将其填充到一个可以调用4次或者其他东西的函数中,但是它可能只是将问题移到函数中,或者它会使代码的可读性降低到我认为不可接受的程度度。

有一件事我认为你可以安全地缩短。

if (y - 1 >= 0 && cells[x][y - 1].checkWalls() == true) {

可以缩短为

if (y - 1 >= 0 && cells[x][y - 1].checkWalls()) {

类似的线条缩短了。 (true == true始终为truefalse == true始终为false,因此将布尔表达式与true进行比较不会执行任何操作。)

每个hV = new VHelper();都可以放在它之前的if语句中。除非你设置它的值,否则你不需要创建对象,对吗?这不会缩短代码,但会阻止您的代码制作一些不必要的对象,从而略微提高效率。

此外,从if (x + 1 < sizeY开始的行看起来像是一个错字 - 你将x值与sizeY进行比较,我猜这不是故意的。 (而且我意识到像这样的微妙错别字是你想要重构的确切原因 - 但是无论你如何安排你的代码,你都必须检查x对着sizeX和y与sizeY的关系。)