2017-04-04 5 views
0

新しいオブジェクトで再利用されているハッシュマップに問題があり、新しいオブジェクトごとに独自のハッシュマップを与える方法がわかりません。したがって、タイムテーブルを生成して保存すると、次のテーブルを作成するときに同じ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; 
} 

ご協力いただきありがとうございます。

+0

'new IndivTables(arr、roomList、table);を実行すると、indivTablesをそれぞれ作成して同じHashMapを作成するので、再利用されます。 – Ishnark

+0

@Ishnarkコメントありがとうございました。どのようにオブジェクトごとに新しいものを作成できますか? – michaelskellig510

答えて

0

forループ反復で新しいIndivTableを作成するために同じハッシュマップ参照を使用しています。したがって、同じHashMapを使用しています。

新しいIndivTables(arr、roomList、table)を の新しいIndivTables(arr、new HashMap()、table)に変更します。

ただし、roomListの内容を保持する場合は、 新しいIndivTables(arr、new HashMap(roomList)、table);

浅いコピーであり、ディープコピーではありませんのでご注意ください。

+0

こんにちは、答えのおかげで、これらのどれもうまくいかないようです。私はまだ同じハッシュマップを使用しています。 – michaelskellig510

関連する問題