2017-04-04 32 views
0

我有一个正在被新对象重用的hashmap的问题,我似乎无法弄清楚如何为每个新对象提供自己的hashmap。所以本质上来说,当我生成一个时间表并保存它等等时,在创建下一个时间表时,它使用同一个roomList,即某些房间的HashMap的int [] []部分已经被预订了已从前面的时间表中生成)。我想要的是具有独特时间表的个人对象,独特的房间列表和arr。hashmap被新对象重新使用

下面是我的代码:

首先是产生时间表的人口的类。

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; 
} 

在此先感谢您的帮助!

+0

当你做'新的IndivTables(arr,roomList,table);'你给每个indivTables你创建相同的HashMap,这就是为什么它被重用。 – Ishnark

+0

@Ishnark感谢您的评论,我如何为每个对象创建一个新的? – michaelskellig510

回答

0

您正在使用相同的散列映射参考在for循环迭代中创建新的IndivTable。因此它使用相同的HashMap。

将以下行新的IndivTables(arr,roomList,表)更改为 新的IndivTables(arr,new HashMap(),table);然而,如果你想保留roomList的内容,那么做这个 新的IndivTables(arr,new HashMap(roomList),表);如果你想保留roomList的内容,那么这个 新的IndivTables

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

+0

嗨,谢谢你的回答,但是,这些似乎都不起作用。我仍然使用相同的hashmap。 – michaelskellig510