在Scala中的成对列表中获取元素的差

时间:2018-07-11 14:23:22

标签: scala

有一个列表可以说:[1,2,3]。我试图找出每两个连续数字的差,然后将它们相加。

例如:上面的列表将给出:(2-1)+(3-2)= 2。我正在寻找一种不使用循环的解决方案。 代码:

val e = List((0,true), (2,true), (7,true))
val w = e.foldLeft(e(0)){ (z1,z2) => z2._1 - z1._1  }

任何人都可以提供一个建议,说明以上代码为何错误吗?

谢谢您的时间。

3 个答案:

答案 0 :(得分:1)

首先,您需要使用 map

将元组列表转换为整数列表
library(lubridate)
df1 %>%
  arrange(ID, mdy(purchase_date)) %>%
  group_by(ID) %>% 
  summarise(FIRST_PURCHASE_DATE = first(purchase_date),
            LAST_PURCHASE_DATE  = last(purchase_date))

产生:

def sum(list: List[Int]) = {
  list.sliding(2).toList.map {
    case List(v1, v2) => v2 - v1
  }.sum
}

val e1 = List(0 -> true, 2 -> true, 7 -> true)

val res1 = sum(e1.map(_._1))

val e2 = List(1 -> true, 2 -> true, 3 -> true)

val res2 = sum(e2.map(_._1))

答案 1 :(得分:0)

可以用 e.foldLeft(e(0)){(z1,z2)=>(z2._1-z1._1,z2._2)} ._ 1

原因是,您正在尝试更改不允许的元素类型。

答案 2 :(得分:0)

 e.unzip._1.sliding(2).map{case List(i, j) => j-i}.sum

在SCALA REPL中的测试:

scala> val e1 = List(0 -> true, 2 -> true, 7 -> true)
e1: List[(Int, Boolean)] = List((0,true), (2,true), (7,true))

scala> e1.unzip._1.sliding(2).map{case List(i, j) => j-i}.sum
res190: Int = 7

scala> val e2 = List(1 -> true, 2 -> true, 3 -> true)
e2: List[(Int, Boolean)] = List((1,true), (2,true), (3,true))

scala> e2.unzip._1.sliding(2).map{case List(i, j) => j-i}.sum
res191: Int = 2

scala>