【问题标题】:hashmap being re-used by new objectshashmap 被新对象重用
【发布时间】:2017-04-04 14:08:40
【问题描述】:

我对新对象重用的哈希图有疑问,我似乎无法弄清楚如何为每个新对象赋予其自己的哈希图。所以本质上,当我生成一个时间表并保存它等时,在制作下一个时间表时,它使用相同的 roomList,即一些房间的哈希图的 int[][] 部分已经被预订(其中已取自先前生成的时间表)。我想要的是一个具有唯一时间表、唯一房间列表和 arr 的独立对象。

下面是我的代码:

第一个是生成大量时间表的类。

public population(int size, boolean init, ArrayList<ListOfObj> arr, HashMap<Room, int[][]> roomList){
        listOfTables = new Tables[size];
        if(init){
            for(int i=0; i<listOfTables.length; i++){
                IndivTables indiv;
                CompleteTable[][][] table = new CompleteTable[5][9][];
                indiv = new IndivTables (arr,roomList,table);
                saveIndiv(i, indiv);
            }
        }
    }

第二个是创建时间表的实际类。

    private CompleteTable[][][] timetable;
    private HashMap<Room, int[][]> roomList;
    private ArrayList<listOfObj> arr;

    public IndivTables (ArrayList<ListOfObj> arr, HashMap<Room, int[][]> roomList, CompleteTable[][][] table){
        this.arr = arr;
        table = generate(arr, roomList);
        this.timetable = table;
        this.roomList = roomList;
    }

下面是创建时间表的函数。这与 IndivTables 属于同一类。

    public static CompleteTable[][][] generate(ArrayList<ListOfObj> arr, HashMap<Room, int[][]> roomList){

        int rows = 5;
        int columns = 9;
        CompleteTable[][][] timeTable = new CompleteTable[rows][columns][];
        HashMap<Room, int[][]> roomListAll = new HashMap<Room, int[][]>(roomList);

        Random random = new Random();

        ListOfObj randomObj;

        Iterator<ListOfObj > iterator = arr.iterator();
        while(iterator.hasNext()){

            boolean clash = false;

            //Get random ListOfObj object
            randomObj= arr.get(random.nextInt(arr.size())); 

            //Allocate room based on most efficient - doesn't do anything to hashmap
            Room room = allocateRoom(roomListAll, randomObj, row, column);
            if(room != null){
                CompleteTable comp = new CompleteTable(randomObj, room);

                if(timeTable[row][column] != null && timeTable[row][column].length>0){
                    if(!clash){
                    int[][] val = roomListAll.get(room);
                    val[row][column] = 1;
                    roomListAll.put(room, val);
                }                   
             }else{                 
                int[][] val = roomListAll.get(room);
                val[row][column] = 1;
                roomListAll.put(room, val);
                clash = false;
             }

             if(!clash){
               arr.remove(randomObj);
             }
          } 
       }
    }
}
  }
 }      
   return timeTable;
 }

提前感谢您的帮助!

【问题讨论】:

  • 当您执行 new IndivTables (arr,roomList,table); 时,您为每个 indivTables 创建相同的 HashMap,这就是它被重用的原因。
  • @Ishnark 感谢您的评论,如何为每个对象创建一个新对象?

标签: java object hashmap int parameter-passing


【解决方案1】:

您正在使用相同的 hashmap 引用在 for 循环迭代中创建新的 IndivTables。因此它使用相同的 HashMap。

将以下行 new IndivTables (arr,roomList,table) 更改为 新的 IndivTables (arr, new HashMap(), table);

但是,如果你想保留 roomList 的内容,那么这样做 新的 IndivTables (arr, new HashMap(roomList), table);

请注意,这是浅拷贝,不是深拷贝。

【讨论】:

  • 您好,感谢您的回答,但是,这些似乎都不起作用。我仍然使用相同的哈希图。
猜你喜欢
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多