Scala 在单步执行时创建包含结束值的范围

Scala 在单步执行时创建包含结束值的范围,scala,scala-collections,Scala,Scala Collections,当使用不对齐的步骤时,有没有办法创建一个包含结束值的范围 例如,以下收益率: scala> Range.inclusive(0, 35, 10) res3: scala.collection.immutable.Range.Inclusive = Range(0, 10, 20, 30) 但我也希望最终值(35)包括如下内容: scala> Range.inclusive(0, 35, 10) res3: scala.collection.immutable.Range.Inclu

当使用不对齐的步骤时,有没有办法创建一个包含结束值的范围

例如,以下收益率:

scala> Range.inclusive(0, 35, 10)
res3: scala.collection.immutable.Range.Inclusive = Range(0, 10, 20, 30)
但我也希望最终值(35)包括如下内容:

scala> Range.inclusive(0, 35, 10)
res3: scala.collection.immutable.Range.Inclusive = Range(0, 10, 20, 30, 35)

不,不适用于当前的定义/实现。所有中间元素的步骤都相同,但与最后一个不同,这将是一种奇怪的行为。

如前所述,这不是一种标准的语义。解决办法

for (i <- 0 to 35 by 10) yield if (35 % 10 != 0 && 35 - i < 10) 35 else i

for(i上述解决方案不起作用,因为它忽略了值“30”。下面是一个展开式解决方案,它生成列表而不是序列

def unfoldRange(i: Int, j: Int, s: Int): List[Int] = {
  if (i >= j) List(j)
  else i :: unfoldRange(i+s,j,s)
}

我认为您也可以通过扩展模式的范围来解决这个问题

object Extensions {
  implicit def RichRange(value: Range) = new {
    def withEnd: IndexedSeq[Int] = {
      if (value.last != value.end) value :+ value.end
      else value
    }
  }
}
虽然您得到的是IndexedSeq[Int]而不是范围。请像以下那样使用它:

import Extensions._
0 to 5 by 2 withEnd // produces 0, 2, 4, 5

是的,这是有意义的-但是我正在考虑一个用例,其中可以使用列索引将集合(表)有效地划分为块。谢谢。根据您是否真的需要索引,您可以使用
。grouped
(我认为循环中的显式索引通常是一种代码味道)尽管我将重新审视我的方法并提出一个更干净的解决方案,但感谢您的帮助,这个解决方案可能会派上用场。