【发布时间】:2017-03-20 21:51:42
【问题描述】:
我正在尝试更新特定的 HashMap 键值,但是,我正在更新的值正在针对我的所有键值进行更新。我有一个键类型 room(我自己的类)的 HashMap 和一个表示房间可用性的 2D int 数组的值。
我有一个 Room 对象,它是我要更新的房间(键)。分配房间的功能并不重要,它只是根据一定的标准分配房间。
行和列只是二维数组中应该更新的位置。但是,此位置的所有键值都在更新,而不仅仅是一个特定的键值。
谁能告诉我我哪里出错了? 提前致谢!
listOfRooms的生成方式:
//Rooms are added to the list as such
listOfRooms.add(new Room ("001", 72, "Lecture", "YY"));
//This function is called which adds the room and an int 2D array to a hash map
public HashMap<Room,int[][]> finaliseRooms(){
int[][] roomAvailability = new int[][]{
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0} };
for(Room room : listOfRooms){
finalListOfRooms.put(room, roomAvailability);
}
return finalListOfRooms;
}
改变特定键的值(此时listOfRooms已经等同于返回值finalListOfRooms):
//This is where I try to change the value of a specific key
HashMap<Room, int[][]> a = new HashMap<Room, int[][]>(listOfRooms);
Room bestRoom = allocateRoom(a, randomMLSC, row, column);
String building = bestRoom.getRoomBuilding().toString();
String roomnum = bestRoom.getRoomNumber().toString();
for(Map.Entry<Room, int[][]> entry : a.entrySet()){
if(entry.getKey().getRoomBuilding().toString().equals(building)){
if(entry.getKey().getRoomNumber().toString().equals(roomnum)){
int[][] val = entry.getValue();
if(val[row][column]==0){
val[row][column] = 1;
}
}
}
}
分配房间:
public Room allocateRoom(HashMap<Room, int[][]> listOfRooms, ModuleLecturerStudentCombination mlsc, int row, int column){
ArrayList<Room> availableRooms = new ArrayList<Room>();
for(Map.Entry<Room, int[][]> entry : listOfRooms.entrySet()){
int[][] av = entry.getValue();
if(av[row][column]==0){
availableRooms.add(entry.getKey());
}
//goes on to do more stuff, not with listOfRooms
}
}
【问题讨论】:
-
我认为
allocateRoom很重要,尤其是当它在操纵地图时。 -
您可以在这里添加您的
Room课程供我们查看吗?很可能是它的哈希码不正确。 -
我非常怀疑问题在于您如何首先填充地图。告诉我们
allocateRoom。 -
@michaelskellig510 首先,请在问题中填写所有额外信息。其次,正如 Louis Wasserman 预测的那样,这是错误的代码。