我有一个不可变的Set类,Set [MyClass],我想使用Set方法intersect和diff,但我希望它们使用我的自定义equals方法测试相等性,而不是默认对象相等性测试
我已经尝试重写==运算符,但它没有被使用.
提前致谢.
编辑:
intersect方法是GenSetLike的具体值成员
规范:http://www.scala-lang.org/api/current/scala/collection/GenSetLike.html src:https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src //library/scala/collection/GenSetLike.scala#L1
def intersect(that: GenSet[A]): Repr = this filter that
Run Code Online (Sandbox Code Playgroud)
所以使用过滤方法完成交叉.
另一个编辑:
过滤器在TraversableLike中定义
规范:http://www.scala-lang.org/api/current/scala/collection/TraversableLike.html
src:https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src//library/scala/collection/TraversableLike.scala#L1
def filter(p: A => Boolean): Repr = {
val b = newBuilder
for (x <- this)
if (p(x)) b += x
b.result
}
Run Code Online (Sandbox Code Playgroud)
对我来说不清楚的是它在没有谓词的情况下使用它,p.这不是一个隐含的参数.
我有一个List[A],如果给出一个相等的函数,如何删除重复的惯用方法(a:A, b:A) => Boolean?我一般不能覆盖equals的A
我现在想的方法是创建一个class AExt覆盖的包装equals,然后
list.map(新的AExt(_)).distinct
但我想知道是否有更清洁的方式.
我只是偶然发现了Tony Morris 关于Java的博客文章之一以及该语言的一个基本问题:为集合定义一个定制的平等关系.这是我认为是一个大问题,并想知道是否有一些scala解决方案.
经典问题表现在考虑交易.假设我在@ 150p进行了两笔+100沃达丰股票交易.这两笔交易是平等的,是吗?除非他们不是同一笔交易.对于普通的真实世界系统,使用持久性或序列化,我不能依赖身份来告诉我两个引用是否属于同一行业!
所以我想要的是能够创建一个我可以传递Equality-relation的集合:
val as = CleverSet[Trade](IdEquality)
val bs = CleverSet[Trade](EconomicsEquality)
Run Code Online (Sandbox Code Playgroud)
我如何以有效的方式实现我的集合(除非EqualityRelation还定义了一种hash机制)?
trait EqualityRelation[T] {
def equal(t1: T, t2: T) : Boolean
def hash(t: T) : Int
}
Run Code Online (Sandbox Code Playgroud)
所以问题是:
似乎带有隐含,添加到现有的scala Set类型将是一件非常容易的事情.
我正在寻找创建身份集的简单方法。我只希望能够跟踪遍历图形时是否“看到”了特定对象。
我不能使用常规Set,因为Set使用“ ==”(Scala中的equals方法)来比较元素。我想要的是一个使用“ eq”的集合。
有什么方法可以在Scala中创建一个Set,该Set使用一些应用程序指定的方法测试相等性,而不是在set元素上调用equals?我在寻找可以覆盖但找不到的“ wrapEquals”方法。
我知道我可以使用Java的IdentityHashMap,但是我正在寻找更通用的东西。
我的另一个想法是将每个set元素包装到另一个根据eq实现equals的对象中,但是生成大量新对象只是为了获得一个新的equals实现是浪费的。
谢谢!