国际Scala序列

时间:2015-10-29 23:36:28

标签: scala int range sequence

我有这样的事情:

    case class FunctionsTest(lowerBound: Int = 1,
                                upperBound: Int = 1000,
                                factor: Int = 2) {
  require(lowerBound < upperBound)

  /**
    * implement a sequence of ints, which start with lowerBound and end with
    * upperbound.
    *
    * for all elements following should be true:
    *
    * xs(i) < xs(i+1)
    * xs(i) + factor == xs(i + 1) (for i > 0 and i <= 1000)
    *
    */
  val xs: Seq[Int] = Seq.range(lowerBound,upperBound +1)

所以我需要这个类的序列来构成这些标准..我用

尝试了
  

Seq.range()

但它创建了适合第一个标准的序列,但我不知道如何应用评论中提到的第二个标准?

4 个答案:

答案 0 :(得分:2)

step的{​​{1}}参数可让您按系数增加。

Seq.range[T](start: T, end: T, step)

这符合两个标准。

scala> Seq.range(1,10,2)
res0: Seq[Int] = List(1, 3, 5, 7, 9)

scala> res0.zip(res0.tail).forall(t => t._1 < t._2)
res4 Boolean = true

答案 1 :(得分:2)

更一般地说,您可以使用iterate

使用任意函数生成序列
Seq.iterate(1,1000)(_ + 2)

对于你的情况,任意函数相当于“a = a + 2”,它一遍又一遍地应用于起始值:1,1 + 2,(1 + 2)+ 2,...

答案 2 :(得分:1)

您可以使用简单的Range创建它。

包含:(lowerBound to UpperBoud)

独家:(lowerBound until UpperBound)

如果你想要一个懒惰的评估者,有点像在邮局等待的磁带计数器,你可以使用scala Stream。它们非常节省内存,因为它们只存储Range的头部,并且只在需要时懒惰地评估尾部。他们的map,filter,reduce,...函数也很懒。

scala.collection.immutable.Stream.range(lowerBound, upperBound)

答案 3 :(得分:1)

range方法允许您设置步骤参数

Seq.range(lower, upper, factor)