在步进时创建包含最终值的范围

时间:2016-05-25 02:15:12

标签: 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.Inclusive = Range(0, 10, 20, 30, 35)

4 个答案:

答案 0 :(得分:0)

不,不是当前的定义/实施。如果所有中间元素的步骤相同但与上一个元素不同,那将是奇怪的行为。

答案 1 :(得分:0)

如上所述,不是标准语义。解决方法,

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

您必须根据需要替换边界和步长值。

答案 2 :(得分:0)

上述解决方案不起作用,因为它忽略了值“ 30”。这是一种展开样式的解决方案,它产生列表而不是序列。

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

答案 3 :(得分:0)

我认为您也可以通过使用Pimp my Library模式扩展Range来解决此问题。

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