簡體   English   中英

Scala:可變的HashMap不會在for循環內更新

[英]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

您可以使用ArrayBufferListBuffer作為您的值類型(請注意,您需要:+=而不是:+來對其進行突變),並在最后轉換為所需的類型。 除非列表很小,否則這將比附加到列表末尾更有效。

最后,請注意,你一般都希望無論是 var或可變類型,不能同時在同一時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM