当前位置: 首页 > 知识库问答 >
问题:

Scala for/屈服语法

钮博裕
2023-03-14

在我正在学习的书中,有一个练习:

编写一个循环,交换整数数组的相邻元素。例如,Array(1,2,3,4,5)变成了Array(2,1,4,3,5)。我的解决方案是:

var v = Array(0,1,2,3,4,5,6,7,8,9)
for (i <- 0 until v.length by 2) {
  var temp = 0
  temp = v(i+1); v(i+1) = v(i); v(i) = temp
}

该算法运行良好,但并没有完全利用Scala的潜力,就像我用C语言写的一样。

重复前面的赋值,但是用交换的值生成一个新数组。用于/产出。

现在我尝试了:

val a = ArrayBuffer(1,2,3,4,5)
var res = for (i <- 0 until a.length by 2) yield a(i)
for (i <- 1 until a.length by 2) res(i-1)=a(i) <---------eclipse give me an error

错误是:“值更新不是 scala.collection.immutable.IndexedSeq[Int] 的成员”

我该如何解决这个任务?我知道语法“for / yield”非常强大,但我不知道如何使用它。

共有3个答案

姜增
2023-03-14

在生成器中,使用< code>0直到v.length乘2,这是一个< code>IndexedSeq。这是您的输入类型,< code>yield将为< code>res生成相同的集合类型。

因为immutable.IndexedSeq是不可变的,所以不能修改它。因此不允许使用res(i-1)=a(i)来更新i-1处的项目。

因此,一种选择是在继续之前将<code>res</code>转换为可变集合

一个通常更可取的选择是在不更新的情况下解决它。这里有一个使用<code>foldLeft</code>的例子,它迭代我们的<code>

val array = Array(1,2,3,4,5)

val result = (
    for ( i <- 0 until array.length by 2) 
    yield 
        if (i < array.length-1) 
            Array(array(i+1), array(i)) 
        else 
            Array(array(i))
).foldLeft (Array[Int]()) ((a,b) => a ++ b )
茅和玉
2023-03-14

我正在通过Scala为不耐烦的自己工作,以刷新我的Scala编码技能。鉴于书中这一点所介绍的概念,我相信作者正在寻找以下内容:

val a = Array(1, 2, 3, 4, 5)
for (i <- 0 until a.length) 
  yield 
    if (i % 2 == 0) 
      if (i == a.length-1) a(i) 
      else a(i+1) 
    else a(i-1)
步炯
2023-03-14

有一个< code >滑动功能可以满足您的需求:

(for {
  i <- Array(1,2,3,4,5).sliding(2,2)
  j <- i.reverse
} yield j).toArray
 类似资料:
  • 我正在写一个小程序,介绍如何计算网格中给定位置的邻域之和。由于某些原因,程序无法识别正确的值。我想知道这可能是因为我使用了try-catch来限制出界,还是我错过了什么? 我使用的是一个简单的3x3网格,编号为1-9。我在许多其他测试中使用了相同的矩阵,因此假设网格没有问题。即使我在一步一步地调试和检查时得到了11。我不太明白,有人有主意吗? 和中的-1只是将其强制为11(2 4 5),但程序在运

  • 楼主情况:产品管理岗,投递之后立即收到AI面试测评,要在3天内完成,我卡点完成的。 问答环节: 1. 项目规划的时候会考虑哪些因素? 2. 工作中如何提高效率,自己会在哪些方面努力?具体讲讲。 3. 5年内的职业规划与人生目标。 4. 谈谈屈臣氏2年来的变化?(英文,此题必考,一定要提前准备好) 5. 屈臣氏有哪些需要提升的地方?(英文,这个题没见过,现场就阿巴阿巴,大概说的是线下店的服务优化)

  • 正如我所理解的关键字,如果从迭代器块内部使用,它会将控制流返回给调用代码,当再次调用迭代器时,它会从中断的地方继续。 而且,不仅等待被调用者,而且还将控制权返回给调用者,只在调用者等待方法时选择停止的位置。 换句话说,没有线程,async和await的“并发性”是由巧妙的控制流引起的幻觉,其细节被语法所掩盖。 现在,我是一名前汇编程序员,我非常熟悉指令指针、堆栈等。我了解正常的控制流(子程序、递归

  • 我在爬的时候遇到了一个问题http://www.brand-in-trend.ru. 正如您在下面看到的,我使用Scrapy并定义了Basespider。第一个解析器工作得非常好,返回在start\u url上找到的所有品牌。 现在,当我想向类别解析器产生回调请求时,我没有得到响应,也没有得到错误。蜘蛛刚刚退出。 蜘蛛网: 我已经尝试了以下方法来解决此问题: 我测试了生成的品牌URL(例如。htt

  • 我有钥匙,有证书,有连锁证书。这个域名看起来像automation.mydomain.com 我有一个Sinatra服务器在上运行,通过确认。 我想将端口80和端口443流量重定向到3000。这是我的配置: 请注意,上述方法不起作用(http://automation.mydomain.com/结果

  • 我正试图从亚马逊印度网站上搜集数据。在以下情况下,我无法使用yield()方法收集响应并解析元素:1)我必须从一个产品页面移动到另一个审阅页面2)我必须从一个审阅页面移动到另一个审阅页面 产品页 评论页 代码流: 1) customerReviewData()调用getCustomerRatingsAndComments(响应) 2) GetCustomerRatings和Comments(res