[英]Scala: mutable HashMap does not update inside for loop
我有一個全局定義的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()中添加元組(字符串,字符串)。
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)
任何一次后調用print(permutedTables)
,值似乎已更新,但是當我在循環外調用時,列表為空
編輯2:我的代碼中的第二次嘗試似乎現在工作(!)。 但是為什么首先不起作用?
我的代碼中的第二次嘗試似乎現在起作用了(!)。 但是為什么首先不起作用?
因為在第一種情況下,您要做的是從permutedTables
獲取列表,所以添加一個元素並丟棄結果而不將其存儲回去。 如果您更改了值,則可以使用,但是List
是不可變的。 使用List
,您需要
permutedTables += pi_k -> permutedTables(pi_k) :+ (url, permutedFP)
或者,如您所見, update
。
您可以使用ArrayBuffer
或ListBuffer
作為您的值類型(請注意,您需要:+=
而不是:+
來對其進行突變),並在最后轉換為所需的類型。 除非列表很小,否則這將比附加到列表末尾更有效。
最后,請注意,你一般都希望無論是 var
或可變類型,不能同時在同一時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.