步进时创建包含结束值的范围
Create Range with inclusive end value when stepping
在使用不对齐的步长时,有什么方法可以创建一个包括最终值的范围吗?
例如以下结果:
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
您必须根据需要替换边界值和步长值。
上述解决方案不起作用,因为它省略了值“30”。这是一个展开式解决方案,它生成一个列表而不是一个序列。
def unfoldRange(i: Int, j: Int, s: Int): List[Int] = {
if (i >= j) List(j)
else i :: unfoldRange(i+s,j,s)
}
我认为您也可以通过使用 Pimp my Library 模式扩展范围来解决这个问题。
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
在使用不对齐的步长时,有什么方法可以创建一个包括最终值的范围吗?
例如以下结果:
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
您必须根据需要替换边界值和步长值。
上述解决方案不起作用,因为它省略了值“30”。这是一个展开式解决方案,它生成一个列表而不是一个序列。
def unfoldRange(i: Int, j: Int, s: Int): List[Int] = {
if (i >= j) List(j)
else i :: unfoldRange(i+s,j,s)
}
我认为您也可以通过使用 Pimp my Library 模式扩展范围来解决这个问题。
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