相关疑难解决方法(0)

如何定义将由不可变Set比较方法使用的自定义相等操作

我有一个不可变的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.这不是一个隐含的参数.

overriding scala set

43
推荐指数
2
解决办法
2万
查看次数

删除列表中指定相等功能的重复项

我有一个List[A],如果给出一个相等的函数,如何删除重复的惯用方法(a:A, b:A) => Boolean?我一般不能覆盖equalsA

我现在想的方法是创建一个class AExt覆盖的包装equals,然后

list.map(新的AExt(_)).distinct

但我想知道是否有更清洁的方式.

scala

15
推荐指数
3
解决办法
8959
查看次数

Scala中的平等关系

我只是偶然发现了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中做到这一点?

似乎带有隐含,添加到现有的scala Set类型将是一件非常容易的事情.

scala equality equals scala-2.8 scala-collections

8
推荐指数
1
解决办法
3175
查看次数

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

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

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

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

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

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

谢谢!

scala scala-collections

5
推荐指数
1
解决办法
1935
查看次数