scala - 我可以在 Scala 中创建一个使用不同 equals/hashCode/compare 实现的集合吗?

标签 scala scala-collections

我正在寻找创建身份集的简单方法。我只是希望能够在遍历图形时跟踪我是否“看到”了特定对象。

我不能使用常规 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/

相关文章:

postgresql - Slick:找不到参数 e 的隐式值:slick.jdbc.SetParameter[Option[java.util.UUID]]

scala - 在 Scala 中交换集合元素的好方法是什么?

scala - 使用框架 REST 进行基本身份验证和 SSL

Scala 集合不一致

java - 等价于 Scala dropWhile

scala - 在Scala 2.10中键入对案例类的别名

scala - 方法调用时的延迟类型推断

html - 我应该如何处理默认助手或 twitterBootstrap 助手在我的 Play 2 应用程序中生成的 html 输出

list - 检查子列表是否存在

Scala集合内存占用特征