新しいオブジェクトで再利用されているハッシュマップに問題があり、新しいオブジェクトごとに独自のハッシュマップを与える方法がわかりません。したがって、タイムテーブルを生成して保存すると、次のテーブルを作成するときに同じroomListが使用されます。つまり、一部の部屋のハッシュマップのint [] []部分がすでに予約されています生成された前のタイムテーブルから取得された)。私が欲しいのは、ユニークなタイムテーブル、ユニークな部屋のリスト、そしてarrを持つindivオブジェクトです。以下は新しいオブジェクトによってハッシュマップが再利用されています
は私のコードです:
最初はタイムテーブルの人口を生成するクラスです。
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);
}
}
}
第2は、タイムテーブルを作成する実際のクラスです。
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
@Ishnarkコメントありがとうございました。どのようにオブジェクトごとに新しいものを作成できますか? – michaelskellig510