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

时间:2010-04-18 11:14:06

标签: scala scala-collections

我正在寻找创建身份集的简单方法。我只想跟踪在浏览图表时是否“看到”某个特定对象。

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

的Set

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

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

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

谢谢!

3 个答案:

答案 0 :(得分: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

  }

并使集合直接包含这些框而不是元素:设置[IdentBox [T]]

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

答案 1 :(得分:2)

This是一个类似的问题。在这种情况下,接受的答案是使用TreeSet并提供自定义Comparator

答案 2 :(得分:-1)

由于您不需要引用“看到”的对象,而只需要“包含”的布尔值,我建议只使用mutable.Set[Int]并使用通过调用{{1}获得的值加载它}}

Scala自定义集合具有足够的概念表面区域,可以吓跑大多数想要快速调整的人。