所以,有一个班级Hotel
,包含20个房间,形式为矩阵4x5(4层,每层5个房间)。类Room
具有以下属性:
floorNumber(int),
roomNumber(int),
numberOfBeds(int),
occupation(boolean)
etc.
对于occupation
,true表示忙,false表示免费。
我必须在酒店实施的一种方法是预留房间
reserve(int floorNumber, int roomNumber)
此方法应检查职业是真还是假 如果是,则保留失败,如果为假,我应该使用方法
将占用设置为truesetOccupation(boolean t).
此外,方法reserve
返回布尔值(true或false),具体取决于保留是否成功。
你猜,在那种方法中,是一个变量范围的问题。
它就是:
public boolean reserve(int floorNumber, int roomNumber){
boolean flag = false;
for ( int i = 0; i < 5; i++){
if(rooms[floorNumber][i].getRoomNumber() == roomNumber){//every element in matrix rooms has this property: rooms[floorNumber][some_number_from_1_to_5]
if (rooms[floorNumber][i].getOccupancy() == false){
rooms[floorNumber][i].setOccupancy(true);
flag = true;
}
else
flag = false;
}
}
return flag;
}
问题是,当我将(在第一行)标志设置为true时,函数返回true,当我将flag设置为false时,函数返回false。 我必须在第一行中将某些值分配给flag的原因是因为编译器显示:
Error: variable flag might not have been initialized
所以,问题是看起来方法永远不会用for循环执行代码 我知道循环中定义的变量不存在于循环外部,但外部定义的变量应该在循环中更改它们的值。 喜欢这个问题: Java - Access variable inside and outside of for-loop
答案 0 :(得分:1)
有一种更简单的方法可以完成您想要做的事情。你根本不需要布尔标志;你可以在成功时立即返回true,如果整个循环没有找到房间就返回false。
public boolean reserve(int floorNumber, int roomNumber){
for (int i = 0; i < 5; i++) {
//every element in matrix rooms has this property:
//rooms[floorNumber][some_number_from_1_to_5]
if (rooms[floorNumber][i].getRoomNumber() == roomNumber){
if (rooms[floorNumber][i].getOccupancy() == false){
rooms[floorNumber][i].setOccupancy(true);
return true;
}
}
}
return false;
}
但是如果你坚持使用你使用旗帜的原始方法,那么:首先给它一个假的值(如果没有房间成功的话)。当我们找到一个未占用的房间(成功)时,将其设置为true。如果我们找到占用的房间,请勿触摸标记值。
public boolean reserve(int floorNumber, int roomNumber){
boolean flag = false;
for (int i = 0; i < 5; i++) {
//every element in matrix rooms has this property:
//rooms[floorNumber][some_number_from_1_to_5]
if (rooms[floorNumber][i].getRoomNumber() == roomNumber){
if (rooms[floorNumber][i].getOccupancy() == false){
rooms[floorNumber][i].setOccupancy(true);
flag = true;
} // else DO NOTHING
}
}
return flag;
}
答案 1 :(得分:1)
我发现了问题所在。
当然,矩阵floorNumber
中的索引rooms[floorNumber][]
从0到3(共4层)。
但在现实生活中,楼层数从1开始,我将争论传递给
reserve(int floorNumber,int roomNumber)
没有考虑到这一点 所以,我只是在方法体中将floorNumber减1,现在就可以了。