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

scala – 解析视图失败

发布时间:2020-12-16 09:58:32 所属栏目:安全 来源:网络整理
导读:我在Seq [Int]上定义了以下diff函数,它使用视图来避免复制数据: object viewDiff { def main(args: Array[String]){ val values = 1 to 10 println("diff="+diffInt(values).toList) } def diffInt(seq: Seq[Int]): Seq[Int] = { val v1 = seq.view(0,seq.s
我在Seq [Int]上定义了以下diff函数,它使用视图来避免复制数据:

object viewDiff {
  def main(args: Array[String]){
    val values = 1 to 10
    println("diff="+diffInt(values).toList)
  }

  def diffInt(seq: Seq[Int]): Seq[Int] = {
    val v1 = seq.view(0,seq.size-1)
    val v2 = seq.view(1,seq.size)
    (v2,v1).zipped.map(_-_)
  }
}

此代码因UnsupportedOperationException而失败.如果我使用切片而不是视图它可以工作.

有谁能解释一下?

[用scala 2.10.5和2.11.6测试]

编辑

我选择了Carlos’s answer,因为它是(第一个)问题的正确解释.但是,som-snytt’s answer更详细,并提供了一个使用压缩对象视图的简单解决方案.

我还发布了适用于这种特定情况的very simple solution .

注意

在上面的代码中,我也在计算seq导数的算法上犯了一个错误.最后一行应该是:seq.head:(v2,v1).zipped.map(_-_)

解决方法

在代码中使用seq.view时,您正在创建无法压缩的SeqView [Int,Seq [Int]]对象,因为它不支持TraversableView.Builder.result.但你可以使用这样的东西:

def diffInt(seq: Seq[Int]) = {
  val v1 = seq.view(0,seq.size-1)
  val v2 = seq.view(1,seq.size)

  (v2.toList,v1.toList).zipped.map {
    case (x1: Int,y1: Int) => x1-y1
    case _ => 0
  }
}

(编辑:李大同)

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

    推荐文章
      热点阅读