Scala: mutable HashMap does not update inside for loop

感情迁移 提交于 2019-12-08 10:23:29

问题


I have a var permutedTables = HashMap[List[Int], List[String, String]] defined globally. I first populate the Hashmap with the keys in a method, which works.

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

The problem occurs when I want to update the values (empty lists) of the HashMap inside a for loop (inside a second method). In other words, I want to add tuples (String, String) in the List() for each key.

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)))

    }

The values do not update. I still have empty lists as values. I don't understand what is wrong with my code.

EDIT 1: When I call print(permutedTables) after any of the two attempts (inside the loop), the value seem updated, but when I call it outside of the loop, the Lists are empty

EDIT 2: The second attempt in my code seems to work now(!). But why does first not work ?


回答1:


The second attempt in my code seems to work now(!). But why does first not work ?

Because what you do in the first case is get a list from permutedTables, add an element and throw away the result without storing it back. It would work if you mutated the value, but a List is immutable. With List, you need

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

Or, as you saw, update.

You can use e.g. ArrayBuffer or ListBuffer as your value type instead (note that you need :+= instead of :+ to mutate them), and convert to your desired type at the end. This is going to be rather more efficient than appending to the end of the list, unless the lists are quite small!

Finally, note that you generally want either var or a mutable type, not both at the same time.



来源:https://stackoverflow.com/questions/33073804/scala-mutable-hashmap-does-not-update-inside-for-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!