加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的平等关系

发布时间:2020-12-16 08:56:20 所属栏目:安全 来源:网络整理
导读:我偶然发现了Tony Morris的一个 blog-posts about Java以及该语言的一个基本问题:为一个集合定义一个定制的平等关系.这是我认为是一个大问题,并想知道是否有一些scala解决方案. 经典问题表现在思考交易.假设我在150便士的情况下进行了100笔沃达丰股票交易.
我偶然发现了Tony Morris的一个 blog-posts about Java以及该语言的一个基本问题:为一个集合定义一个定制的平等关系.这是我认为是一个大问题,并想知道是否有一些scala解决方案.

经典问题表现在思考交易.假设我在150便士的情况下进行了100笔沃达丰股票交易.这两笔交易是平等的,是吗?除非他们不是同一笔交易.对于普通的真实世界系统,通过持久性或序列化,我不能依赖于身份来告诉我两个引用是否属于同一行业!

所以我想要的是能够创建一个我可以传递Equality-relation的集合:

val as = CleverSet[Trade](IdEquality)
val bs = CleverSet[Trade](EconomicsEquality)

如何以有效的方式实现我的集合(除非EqualityRelation还定义了一个哈希机制)?

trait EqualityRelation[T] {
  def equal(t1: T,t2: T) : Boolean
  def hash(t: T) : Int
}

所以问题是:

>有没有提供这种能力的图书馆?
>在Scala中有什么方法可以做到这一点吗?

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

解决方法

这可以通过Java的TreeSet和Comparator实现来实现:

TreeSet<String> ignoreCase = new TreeSet<String>(new Comparator<String>(){
    @Override
    public int compare(String o1,String o2) {
        return o1.compareToIgnoreCase(o2);
    }});

TreeSet<String> withCase = new TreeSet<String>();

List<String> values = asList("A","a");
ignoreCase.addAll(values);
withCase.addAll(values);

输出:

ignoreCase -> [A]
withCase -> [A,a]

这样做的缺点是比较器要实现的功能比需要的更强大,并且您只能使用支持比较器的集合.正如oxbow_lakes所指出的,Comparator实现打破了Set契约(对于!a.equals(b)它可能是新的Set(); set.add(a)== true&& set.add(b)= = false).

Scala通过A =>的视图转换支持这一点.有序[A].

scala> new scala.collection.immutable.TreeSet[String]()(x=> x.toLowerCase) + "a"
 + "A"
res0: scala.collection.immutable.TreeSet[String] = Set(A)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读