我正在寻找一种简单的方法来创建一个身份集。我只想能够跟踪我是否在遍历图形时“看到”了特定对象。
我不能使用常规Set,因为Set使用“==”(Scala中的equals方法)来比较元素。我想要的是一个使用“eq”进行比较的Set。
有没有办法在Scala中创建一个Set,该Set使用某些应用程序指定的方法来测试相等性,而不是在集合元素上调用equals?我寻找了一些可以覆盖的“wrapEquals”方法,但没有找到它。
我知道我可以使用Java的IdentityHashMap,但我正在寻找更通用的东西。
我另一个想法是只需将每个集合元素包装在另一个实现eq的对象中,但是生成大量新对象只是为了获得新的equals实现,这是浪费的。
谢谢!
我不能使用常规Set,因为Set使用“==”(Scala中的equals方法)来比较元素。我想要的是一个使用“eq”进行比较的Set。
有没有办法在Scala中创建一个Set,该Set使用某些应用程序指定的方法来测试相等性,而不是在集合元素上调用equals?我寻找了一些可以覆盖的“wrapEquals”方法,但没有找到它。
我知道我可以使用Java的IdentityHashMap,但我正在寻找更通用的东西。
我另一个想法是只需将每个集合元素包装在另一个实现eq的对象中,但是生成大量新对象只是为了获得新的equals实现,这是浪费的。
谢谢!
hashCode
是可行的(实际上只要对于相同的实例返回相同的值,任何哈希函数都是可行的),但也许使用System.identityHashCode(value)
会更好? - SumaidentityHashCode
是一个32位值(int
),因此在64位JVM上不能保证其唯一性。尽管如此,它仍然比与case class
值相等配合设计的hashValue
更具唯一性,这正是您现在正在使用的内容。在您的情况下,任何东西都可以工作,因为您不会使用identityHashCode
来执行比较,只需作为哈希值来伴随基于eq
的比较即可。 - Suma