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

我如何形成scala SortedMaps的联合?

发布时间:2020-12-16 18:51:53 所属栏目:安全 来源:网络整理
导读:(我正在使用 Scala nightlies,并在2.8.0b1 RC4中看到相同的行为.我是Scala的新手.) 我有两个SortedMaps,我想形成联盟.这是我想要使用的代码: import scala.collection._object ViewBoundExample { class X def combine[Y](a: SortedMap[X,Y],b: SortedMap[X
(我正在使用 Scala nightlies,并在2.8.0b1 RC4中看到相同的行为.我是Scala的新手.)

我有两个SortedMaps,我想形成联盟.这是我想要使用的代码:

import scala.collection._

object ViewBoundExample {
    class X
    def combine[Y](a: SortedMap[X,Y],b: SortedMap[X,Y]): SortedMap[X,Y] = {
        a ++ b
    }
    implicit def orderedX(x: X): Ordered[X] = new Ordered[X] { def compare(that: X) = 0 }
}

这里的想法是’隐式’语句意味着Xs可以转换为Ordered [X],然后将SortedMaps组合成另一个SortedMap,而不仅仅是一个map.

当我编译时,我得到了

sieversii:scala-2.8.0.Beta1-RC4 scott$bin/scalac -versionScala compiler version
2.8.0.Beta1-RC4 -- Copyright 2002-2010,LAMP/EPFL

sieversii:scala-2.8.0.Beta1-RC4 scott$bin/scalac ViewBoundExample.scala
ViewBoundExample.scala:8: error: type arguments [ViewBoundExample.X] do not
    conform to method ordered's type parameter bounds [A <: scala.math.Ordered[A]]
        a ++ b
          ^
one error found

如果该类型参数绑定是[A<%scala.math.Ordered [A]]而不是[A<:scala.math.Ordered [A]],那么我的问题似乎就会消失.不幸的是,我甚至无法找出“命令”生活的方法!任何人都可以帮我追踪它吗? 如果做不到这一点,我打算如何制作两个SortedMaps的联合?如果我删除了返回类型的组合(或将其更改为Map)一切正常 – 但是我不能依赖返回的排序!

解决方法

目前,您使用的是scala.collection.SortedMap特征,其方法继承自MapLike特征.因此,您会看到以下行为:

scala> import scala.collection.SortedMap
import scala.collection.SortedMap

scala> val a = SortedMap(1->2,3->4)
a: scala.collection.SortedMap[Int,Int] = Map(1 -> 2,3 -> 4)

scala> val b = SortedMap(2->3,4->5)
b: scala.collection.SortedMap[Int,Int] = Map(2 -> 3,4 -> 5)

scala> a ++ b
res0: scala.collection.Map[Int,2 -> 3,3 -> 4,4 -> 5)

scala> b ++ a
res1: scala.collection.Map[Int,4 -> 5)

返回结果的类型是Map [Int,Int],因为这将是MapLike对象返回方法的唯一类型.似乎保留了SortedMap的sorted属性,我想这是因为使用抽象方法来进行连接,并且这些抽象方法被定义为保持map的顺序.

为了拥有两个有序映射的联合,我建议你使用scala.collection.immutable.SortedMap.

scala> import scala.collection.immutable.SortedMap
import scala.collection.immutable.SortedMap

scala> val a = SortedMap(1->2,3->4)
a: scala.collection.immutable.SortedMap[Int,4->5)
b: scala.collection.immutable.SortedMap[Int,4 -> 5)

scala> a ++ b
res2: scala.collection.immutable.SortedMap[Int,4 -> 5)

scala> b ++ a
res3: scala.collection.immutable.SortedMap[Int,4 -> 5)

SortedMap特征的这种实现声明了一个返回SortedMap的方法.

现在,您对类型边界的问题有几个答案:

> Ordered [T]是一个特征,如果在一个类中混合,它指定可以使用&lt ;,>,=,> =,< =来比较该类.你只需要定义抽象方法compare(that:T),它为此返回-1<那,1为此>那个和0对于这个==那个.然后基于比较结果在特征中实现所有其他方法.
> T<%U表示Scala中的视图绑定.这意味着类型T要么是U的子类型,要么可以通过范围中的隐式转换隐式转换为U.如果您将<%但不与<:放在一起,因为X不是Ordered [X]的子类型,但是可以使用OrderedX隐式转换隐式转换为Ordered [X].
编辑:关于你的评论.如果您正在使用scala.collection.immutable.SortedMap,那么您仍然在编程接口而不是实现,因为不可变的SortedMap被定义为特征.您可以将其视为scala.collection.SortedMap的一个更专业的特性,它提供了额外的操作(比如返回SortedMap)和不可变的属性.这符合Scala哲学 – 更喜欢不变性 – 因此我没有看到使用不可变SortedMap的任何问题.在这种情况下,您可以保证结果肯定会被排序,并且由于集合是不可变的,因此无法更改.

虽然,我仍然觉得奇怪的是scala.collection.SortedMap没有提供一个返回SortedMap的方法作为结果.我所做的所有有限测试似乎都表明,两个scala.collection.SortedMaps的串联结果确实产生了一个保存已排序属性的映射.

(编辑:李大同)

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

    推荐文章
      热点阅读