Как сопоставить список номеров со списком их дельт в Scala? - PullRequest
8 голосов
/ 11 ноября 2011

Предположим, у меня есть список номеров. Как преобразовать список в список их «дельт» - попарных разностей последующих чисел?

Например: учитывая List(5, 2, 1, 1) я хотел бы получить List(3, 1, 0)

Ответы [ 6 ]

15 голосов
/ 12 ноября 2011

Правильный ответ:

(xs, xs drop 1).zipped.map(_-_)

И он даже не взорвется, когда вы передадите ему пустой или однозначный список.

10 голосов
/ 11 ноября 2011
List(5,2,1,1).sliding(2).map(pair => pair(0) - pair(1))
5 голосов
/ 11 ноября 2011

Два других возможных решения:

list.zip(list.drop(1)).map { case (x, y) => x - y }

// in case you don't like the extractor method of dealing with Tuples
list.zip(list.drop(1)).map(p => p._1 - p._2)
3 голосов
/ 12 ноября 2011

Для всех, кто предпочитает для понимания по картам, не возражает против экстракторов и любит называть промежуточные результаты:

for (List(current, next) <- list.sliding(2);
     delta = current - next)
  yield delta
3 голосов
/ 11 ноября 2011

Это не очень эффективно (создание списка из двух элементов для каждой пары соседних чисел), но

list.sliding(2).map(x=>(x(0)-x(1)))

должен дать вам то, что вы хотите.

1 голос
/ 12 ноября 2011

Рекурсивный способ:

scala> def calcDeltas(l:List[Int]):List[Int] = l match {
     | case Nil => Nil
     | case x::Nil => Nil
     | case x::y::Nil => (x-y)::Nil
     | case x::y::tail => (x-y)::calcDeltas(y::tail)
     | }
...