【问题标题】:Update a specific HashMap key value更新特定的 HashMap 键值
【发布时间】: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 预测的那样,这是错误的代码。

标签: java object hashmap


【解决方案1】:

finaliseRooms 方法中,您将相同的数组分配给每个键,这意味着当一个条目更改时,所有条目都会更改。您应该在 for each 循环中移动 roomAvailability 的声明。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 2016-04-21
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2019-01-07
    • 2011-10-09
    相关资源
    最近更新 更多