我正在寻找创建身份集的简单方法。我只想跟踪在浏览图表时是否“看到”某个特定对象。
我不能使用常规Set,因为Set使用“==”(Scala中的equals方法)来比较元素。我想要的是一个使用“eq。”
的Set有没有办法在Scala中创建一个Set,它使用一些应用程序指定的方法来测试相等性而不是在set元素上调用equals?我找了一些“wrapEquals”方法,我可以覆盖但是找不到它。
我知道我可以使用Java的IdentityHashMap,但我正在寻找更通用的东西。
我的另一个想法是将每个set元素包装在另一个以eq方式实现equals的对象中,但是为了获得一个新的equals实现而生成大量新对象是浪费的。
谢谢!
答案 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自定义集合具有足够的概念表面区域,可以吓跑大多数想要快速调整的人。