我有以下代码:
while (something < something) {
array2.clear();
}
}
如何缩短此循环,似乎非常重复,尤其是前4个if语句。我应该使用switch语句吗?如果是这样,你能用一个我的if语句给我一个例子。
答案 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
始终为true
,false == true
始终为false
,因此将布尔表达式与true
进行比较不会执行任何操作。)
每个hV = new VHelper();
都可以放在它之前的if语句中。除非你设置它的值,否则你不需要创建对象,对吗?这不会缩短代码,但会阻止您的代码制作一些不必要的对象,从而略微提高效率。
此外,从if (x + 1 < sizeY
开始的行看起来像是一个错字 - 你将x值与sizeY进行比较,我猜这不是故意的。 (而且我意识到像这样的微妙错别字是你想要重构的确切原因 - 但是无论你如何安排你的代码,你都必须检查x对着sizeX和y与sizeY的关系。)