我正在寻找创建身份集的简单方法。我只是希望能够在遍历图形时跟踪我是否“看到”了特定对象。
我不能使用常规 Set,因为 Set 使用“==”(Scala 中的 equals 方法)来比较元素。我想要的是一个使用“eq”的集合。
有没有办法在 Scala 中创建一个 Set ,它使用一些应用程序指定的方法来测试相等性而不是在 set 元素上调用 equals ?我寻找了某种可以覆盖但没有找到的“wrapEquals”方法。
我知道我可以使用 Java 的 IdentityHashMap,但我正在寻找更通用的东西。
我的另一个想法是将每个 set 元素包装在另一个根据 eq 实现 equals 的对象中,但是为了获得新的 equals 实现而生成大量新对象是浪费的。
谢谢!
最佳答案
根据您的需要,您可以创建一个框,对包含的元素进行身份检查,例如:
class IdentBox[T <: AnyRef](val value: T) {
override def equals(other: Any): Boolean = other match {
case that: IdentBox[T] => that.value eq this.value
case _ => false
}
override def hashCode(): Int = value.hashCode
}
并使集合包含这些框而不是直接包含元素:Set[IdentBox[T]]
它有一些装箱/拆箱的开销,但在您的用例中可能是可以容忍的。
关于scala - 我可以在 Scala 中创建一个使用不同 equals/hashCode/compare 实现的集合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2662020/