gpt4 book ai didi

Scala 可变集 : strange behavior

转载 作者:行者123 更新时间:2023-12-04 17:54:26 31 4
gpt4 key购买 nike

我无法解释 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: Ignore case class field for equals/hascode? ,我通过更改声明案例类的方式解决了这个问题:

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

这样,内部集合将被忽略哈希码和等于评估,但仍可作为字段访问。

最佳答案

Item 的哈希码会在您更改 content 时更改。由于 Set(...) 创建的集合是一个散列集,如果其元素的散列值发生变化,它就无法正常工作。请注意,Set[Item] 是否可变并不重要;只有 content 是可变的。

如果您将可变对象放入散列集中或将它们用作散列映射的键,您必须确保 1) 它们在那里时不发生变化或 2) 它们的 hashCode 方法稳定。

关于Scala 可变集 : strange behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25540702/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com