2015-10-29 3 views
0

У меня есть что-то вроде этого:Scala Последовательность Int

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()

но он создает мне последовательность, которая подходит для первых критериев, но я не знаю, как применить другие критерии, упомянутые в комментарии?

ответ

2

Параметр Seq.range[T](start: T, end: T, step)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 

и

scala> res0(0) + 2 == res0(0 + 1) 
res5: Boolean = true 
+1

Есть, конечно, лучшая альтернатива, чем использование 'List # tail' - http://stackoverflow.com/a/23184020/409976. –

+0

Благодарим вас за ответ, но, как уже упоминал об этом @Kevin Meredith, я бы сделал это немного иначе, чем застегнул его, а затем проверил значения с помощью операции forall. В любом случае, спасибо за ваше решение! – Bajro

1

Вы можете создать его с помощью простого Range.

включительно: (lowerBound to UpperBoud)

эксклюзив: (lowerBound until UpperBound)

Если вы хотите ленивый вычислитель, вроде как счетчик ленты для ожидания в почтовом отделении, вы можете использовать Scala Stream. Они очень эффективны с точки зрения памяти, потому что они только хранят голову диапазона и лениво оценивают хвост только тогда, когда это необходимо. Их карты, фильтры, сокращения, ... функции также ленивы.

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

Да, ld - отличная идея с использованием Stream, спасибо за идею! – Bajro

1

Метод диапазона позволяет установить параметр шага

Seq.range(lower, upper, factor) 
+0

Да, это создало бы список - в моем случае - как: Seq (1,3,5,7) и так далее, но это не соответствовало моим критериям. – Bajro

2

В целом, вы можете создать последовательность, используя произвольную функцию, используя iterate:

Seq.iterate(1,1000)(_ + 2) 

В вашем случае, произвольная функция сводится к «а = + 2 ", который накладывается снова и снова на начальное значение: 1, 1 + 2, (1 + 2) +2, ...

Смежные вопросы