2015-06-29 1 views
2

Начнет с моим кодомТого же значение для каждого ключа в HashMap

public void simulateSale(List<IceCream> dailyIceCreamStock) { 
    date = LocalDate.now().minusDays(6); 
    DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd"); 

    for (int i = 0; i < timeInterval; i++) { 
     for(IceCream iceCream: dailyIceCreamStock){ 
      iceCream.setSoldCount(rand.nextInt(IceCream.AMOUNT + 1)); 
      iceCream.setStockDate(date); 
     } 

     //Every day should have different ArrayList of values 
     this.weeklyStats.put(date.toString(fmt), dailyIceCreamStock); 
     date = date.plusDays(1); 
    } 

Проблема в этой строке: this.weeklyStats.put(date.toString(fmt), dailyIceCreamStock);

Как вы можете видеть, я добавляю случайным образом сгенерированных значений в HashMap типа:

Map<String, List<IceCream>> weeklyStats 

Проблема в том, что когда я повторяю эту хэш-карту, каждая клавиша имеет тот же список значений. Результат выглядит следующим образом:

[11, 3, 11, 12, 20] 
[11, 3, 11, 12, 20] 
[11, 3, 11, 12, 20] 
[11, 3, 11, 12, 20] 
[11, 3, 11, 12, 20] 
[11, 3, 11, 12, 20] 
[11, 3, 11, 12, 20] 

Желаемый результат должен иметь случайные значения в каждом из этих списков. Я думаю, что есть проблема с областью видимости, которую я не понимаю

+0

В вашей петле нет переменной. Что такое timeInterval? – nafas

+0

timeInterval - глобальная переменная int, для этого случая ее значение равно 7 – user2151486

+0

, так как другие ответы, dailyIceCreamStock будет одинаковым для каждого еженедельника. – nafas

ответ

4

Вы добавляете к экземпляру экземпляр экземпляра несколько раз. Вы должны создавать копии списка, чтобы иметь различные значения в вашей карте:

for (int i = 0; i < timeInterval; i++) { 
    List<IceCream> copy = new ArrayList<>(dailyIceCreamStock); // create a copy 
    for(IceCream iceCream: copy){ // modify the elements of the copy 
     iceCream.setSoldCount(rand.nextInt(IceCream.AMOUNT + 1)); 
     iceCream.setStockDate(date); 
    } 

    //Every day should have different ArrayList of values 
    this.weeklyStats.put(date.toString(fmt), copy); // put the copy in the Map 
    date = date.plusDays(1); 
} 

EDIT:

На самом деле, это не достаточно, вы должны создавать копии экземпляров МОРОЖЕНОГО тоже. В противном случае все списки будут разными экземплярами, но все равно будут содержать те же объекты IceCream.

for (int i = 0; i < timeInterval; i++) { 
    List<IceCream> copy = new ArrayList<>(); 
    for(IceCream iceCream: dailyIceCreamStock){ 
     IceCream newIC = new IceCream(); // not sure if you want to copy any 
             // data from the original IceCream 
     newIC.setSoldCount(rand.nextInt(IceCream.AMOUNT + 1)); 
     newIC.setStockDate(date); 
     copy.add(newIC); // add a new IceCream instance to the new List 
    } 

    //Every day should have different ArrayList of values 
    this.weeklyStats.put(date.toString(fmt), copy); 
    date = date.plusDays(1); 
} 
+0

Он работает! Благодарю. Ты спас меня от самоубийства :) – user2151486

3

Каждая итерация, вы изменяете же List<IceCream> dailyIceCreamStock, так что все ключи в Map точку в этом же списке.

Возможно, вы захотите инициализировать и ссылаться на новую, глубокую копию вашего List на каждой итерации и поместить ее в свой Map вместо того, чтобы выполнялись случайные мутации.

Смежные вопросы