请我从循环中删除了返回语句,并且在循环结束时只有两个方法的返回语句。
private boolean productFitsAt(int lOrigin, int wOrigin, int[] product) {
for (int i = wOrigin; i < wOrigin + product[Data.WID]; i++) {
for (int j = lOrigin; j < lOrigin + product[Data.LEN]; j++) {
if (i >= BOX_WIDTH || j >= BOX_LENGHT || BOX[i][j] != EMPTY) {
return false;
}
}
}
return true;
}
private boolean putProductIntoBox(int[] product) {
int[] a = getFreePositionToFit(product);
if (a == null) {
return false;
}
if (maxWeight < product[Data.WT]) {
return false;
}
for (int i = a[0]; i < a[0] + product[Data.WID]; i++) {
for (int j = a[1]; j < a[1] + product[Data.LEN]; j++) {
BOX[i][j] = product[Data.ID];
}
}
maxWeight -= product[Data.WT];
return true;
}
答案 0 :(得分:2)
我会标记外部循环,并在result
被分配false
后突破它,例如:
private boolean productFitsAt(int lOrigin, int wOrigin, int[] product) {
boolean result = true;
outer :for (int i = wOrigin; i < wOrigin + product[Data.WID]; i++) {
for (int j = lOrigin; j < lOrigin + product[Data.LEN]; j++) {
if (i >= BOX_WIDTH || j >= BOX_LENGHT || BOX[i][j] != EMPTY) {
result = false;
break outer;
}
}
}
return result;
}
答案 1 :(得分:1)
您可以使用boolean
变量来存储返回值,并在方法的末尾返回该变量:
private boolean productFitsAt(int lOrigin, int wOrigin, int[] product) {
boolean result = true;
for (int i = wOrigin; i < wOrigin + product[Data.WID] && result; i++) {
for (int j = lOrigin; j < lOrigin + product[Data.LEN] && result; j++) {
if (i >= BOX_WIDTH || j >= BOX_LENGHT || BOX[i][j] != EMPTY) {
result = false;
}
}
}
return result;
}
请注意,一旦确定返回值为false
,您就不想继续循环。由于你有嵌套循环,break语句不够(因为它只会突破内循环),所以我将result
变量添加到两个循环的条件中。
答案 2 :(得分:1)
您还可以使用Java 8 Streams将嵌套循环转换为嵌套的allMatch
或anyMatch
语句。请注意,使用allMatch
时,您必须反转条件:
private boolean productFitsAt(int lOrigin, int wOrigin, int[] product) {
return IntStream.range(wOrigin, wOrigin + product[Data.WID])
.allMatch(i -> IntStream.range(lOrigin, lOrigin + product[Data.LEN])
.allMatch(j -> (i < BOX_WIDTH && j < BOX_LENGTH && BOX[i][j] == EMPTY)));
}