簡體   English   中英

Scala可變集:奇怪的行為

[英]Scala mutable set: strange behavior

我無法解釋Scala集的這種行為。

讓我們從幾個定義開始。

import scala.collection.mutable.Set
case class Item(name: String, content: Set[Int])
val items: Set[Item] = Set.empty

我會在我的套裝中添加一個項目。

items += Item("name", Set(1, 2, 3))

我會清空我的內心。

items.filter(_.name == "name") foreach (_.content -= 1)
items
// res7: scala.collection.mutable.Set[Item] = Set(Item(name,Set(2, 3)))

到現在為止還挺好。

items.filter(_.name == "name") foreach (_.content -= 2)
items.filter(_.name == "name") foreach (_.content -= 3)
items
// res12: scala.collection.mutable.Set[Item] = Set(Item(name,Set()))

完善! 現在,我真正想做的是刪除內部空集的條目。

items.retain(_.content.nonEmpty)
items
// res12: scala.collection.mutable.Set[Item] = Set(Item(name,Set()))

沒工作。 也許我做了相反的測試。

items.retain(_.content.isEmpty)
items
// res14: scala.collection.mutable.Set[Item] = Set(Item(name,Set()))

也沒用。 也許過濾器不起作用。

items.filter(_.content.nonEmpty)
// res15: scala.collection.mutable.Set[Item] = Set()

過濾器工作正常。 也許我無法改變它,因為它是一個val。

items += Item("name", Set.empty)
items
// res17: scala.collection.mutable.Set[Item] = Set(Item(name,Set()), Item(name,Set()))

我可以改變它。 並添加...更多相同? 也許他們都不一樣。

items += Item("name", Set.empty)
items
// res19: scala.collection.mutable.Set[Item] = Set(Item(name,Set()), Item(name,Set()))

他們並非完全不同。 那我可以刪除它們中的任何一個嗎?

items -= Item("name", Set.empty)
items
// res21: scala.collection.mutable.Set[Item] = Set(Item(name,Set()))

我可以刪除一個。 我可以刪除另一個,我一直試圖從一開始刪除的那個嗎?

items -= Item("name", Set.empty)
items
// res23: scala.collection.mutable.Set[Item] = Set(Item(name,Set()))

不。 發生了什么? 我很困惑。

編輯,解決方案:

使用此Stackoverflow帖子, Scala:忽略case類字段為equals / hascode? ,我通過改變聲明case類的方式解決了這個問題:

case class Item(name: String)(val content: Set[Int])

這樣,內部集合被忽略為哈希碼並等於評估,但仍可作為字段訪問。

更改content時, Item哈希碼會更改。 由於Set(...)創建的Set(...)是散列集,因此如果其元素的散列發生更改,則無法正常工作。 請注意, Set[Item]是否可變是無關緊要的; 只有那些content是可變的。

如果將可變對象放入哈希集或將它們用作哈希映射的鍵,則必須確保1)它們在那里或2)它們的hashCode方法穩定時不會發生變異。

暫無
暫無

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

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