我在全球范围内定义了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:我的代码中的第二次尝试现在似乎正常工作(!)。但为什么首先不起作用?
答案 0 :(得分:1)
我的代码中的第二次尝试现在似乎正常工作(!)。但为什么首先不起作用?
因为你在第一种情况下所做的是从permutedTables
获取一个列表,所以添加一个元素并丢弃结果而不将其存回。如果您突变该值,它将起作用,但List
是不可变的。使用List
,您需要
permutedTables += pi_k -> permutedTables(pi_k) :+ (url, permutedFP)
或者,正如您所见,update
。
您可以使用例如ArrayBuffer
或ListBuffer
代替您的值类型(请注意,您需要:+=
而不是:+
来改变它们),并在最后转换为您想要的类型。除非列表非常小,否则这将比附加到列表末尾更有效!
最后,请注意,您通常希望 var
或可变类型,而不是两者同时。