5

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

我不能使用常规 Set 因为 Set 使用“==”(Scala 中的 equals 方法)来比较元素。我想要的是一个使用“eq”的集合。

有什么方法可以在 Scala 中创建一个 Set 使用某些应用程序指定的方法来测试相等性,而不是在 set 元素上调用 equals ?我寻找某种可以覆盖但没有找到的“wrapEquals”方法。

我知道我可以使用 Java 的 IdentityHashMap,但我正在寻找更通用的东西。

我的另一个想法是将每个 set 元素包装在另一个根据 eq 实现 equals 的对象中,但是为了获得新的 equals 实现而生成大量新对象是浪费的。

谢谢!

4

3 回答 3

3

根据您的需要,您可以创建一个框,对包含的元素使用身份检查,例如:

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

它有一些装箱/拆箱的开销,但在您的用例中可能是可以容忍的。

于 2016-11-28T21:34:07.360 回答
1

是一个类似的问题。在这种情况下,接受的答案是使用 aTreeSet并提供一个 custom Comparator

于 2010-04-18T15:09:33.897 回答
-1

由于您不需要对“已见”对象的引用,而只是“包含”的布尔值,我建议只使用 amutable.Set[Int]并将其加载到通过调用System.identityHashCode(obj).

Scala 自定义集合有足够的概念表面积来吓跑大多数想要像这样快速调整的人。

于 2010-04-19T07:51:45.067 回答