Scala:可变HashMap不会在for循环中更新

时间:2015-10-12 05:25:28

标签: scala hashmap tuples

我在全球范围内定义了var permutedTables = HashMap[List[Int], List[String, String]]。我首先使用方法中的键填充Hashmap,该方法有效。

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

当我想在for循环内(第二个方法内)更新HashMap的值(空列表)时,会出现问题。换句话说,我想在List()中为每个键添加元组(String,String)。

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 个答案:

答案 0 :(得分:1)

  

我的代码中的第二次尝试现在似乎正常工作(!)。但为什么首先不起作用?

因为你在第一种情况下所做的是从permutedTables获取一个列表,所以添加一个元素并丢弃结果而不将其存回。如果您突变该值,它将起作用,但List是不可变的。使用List,您需要

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

或者,正如您所见,update

您可以使用例如ArrayBufferListBuffer代替您的值类型(请注意,您需要:+=而不是:+来改变它们),并在最后转换为您想要的类型。除非列表非常小,否则这将比附加到列表末尾更有效!

最后,请注意,您通常希望 var或可变类型,而不是两者同时。