2015-10-12 4 views
0

У меня есть var permutedTables = HashMap[List[Int], List[String, String]], определенный глобально. Сначала я заполняю Hashmap ключами в методе, который работает.Scala: изменчивый HashMap не обновляется внутри цикла

print(permutedTables) : 
Map(List(1,2,3,4) -> List(), 
List(2,4,5,6) -> List(), etc...) 

Проблема возникает, когда я хочу, чтобы обновить значения (пустые списки) в HashMap внутри для цикла (внутри второго способа). Другими словами, я хочу добавить кортежи (String, String) в List() для каждого ключа.

for(pi_k <- permutedTables.keySet){ 
     var mask = emptyMask; 
     mask = pi_k.foldLeft(mask)((s, i) => s.updated(i, '1')) 
     val maskB = Integer.parseInt(mask,2) 

     val permutedFP = (intFP & maskB).toBinaryString 

    // attempt 1 : 
    // permutedTables(pi_k) :+ (url, permutedFP) 
    // attempt 2 : 
    // permutedTables.update(pi_k, permutedTables(pi_k):::List((url, permutedFP))) 

    } 

Значения не обновляются. У меня все еще есть пустые списки в качестве значений. Я не понимаю, что не так с моим кодом.

РЕДАКТИРОВАТЬ 1: Когда слово print(permutedTables) после того, как любой из двух попыток (внутри цикла), значение, похоже, обновляется, но когда я называть его вне цикла, списки являются пустыми

РЕДАКТИРОВАТЬ 2: Вторая попытка в моем коде, кажется, работает сейчас (!). Но почему сначала не работает?

ответ

1

Вторая попытка в моем коде кажется работать сейчас (!). Но почему сначала не работает?

Поскольку вы делаете в первом случае, получите список от permutedTables, добавьте элемент и выбросьте результат, не сохраняя его. Он будет работать, если вы мутировали значение, но List неизменно. С List, вам нужно

permutedTables += pi_k -> permutedTables(pi_k) :+ (url, permutedFP) 

Или, как вы видели, update.

Вы можете использовать, например. ArrayBuffer или ListBuffer вместо вашего значения (обратите внимание, что вам нужно :+= вместо :+ для их изменения) и конвертировать в нужный тип в конце. Это будет более эффективным, чем добавление к концу списка, если только списки не очень малы!

Наконец, обратите внимание, что вы обычно хотите либоvar, либо изменяемый тип, но не оба одновременно.

+0

Привет, Алексей, у меня есть аналогичная проблема. После просмотра сообщения я изменил свой код на использование update(), добавив в HashMap val tempLHM = new HashMap [String, String] // [edge, vertex] pit.foreach {x => val pp = x.getList (0) .iterator()/ while (pp.hasNext()) { val pitcol = pp.next(). ToString(). Split ("\\ s +") tempLHM.update (pitcol.apply (0) .toString(), pitcol.apply (2) .toString()) // level0 ppin отображается как edge-> vertex println (tempLHM.size)}} println (tempLHM.size) – user1384205

+0

Пожалуйста, не то, чтобы первая печать stmt внутри цикла while печатает размер правильно, но stmt на последней строке печатает 0. – user1384205

+0

@ user1384205 Лучше спросите отдельный вопрос, это невозможно прочитать. –

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