有一个包含值列表的 RDD,这些值是正值和负值的混合。 需要根据此数据计算周期数。
例如,
val range = List(sampleRange(2020,2030,2040,2050,-1000,-1010,-1020,起点,-1030,2040,-1020,2050,2040,2020,终点, -1060,-1030,-1010)
上面列表中每个值之间的间隔是 1 秒。即,2020 和 2030 以 1 秒为间隔记录,依此类推。
它从负转正并保持正 >= 2 秒的次数。
如果 >= 2 秒,则为一个循环。
周期数:逻辑
示例 1: 列表(1,2,3,4,5,6,-15,-66)
循环次数为1。
原因:当我们从列表的第一个元素移动到第 6 个元素时,我们有 5 个间隔,这意味着 5 秒。所以一个循环。
当我们移动到列表的第 6 个元素时,它是一个负值。所以我们从第 6 个元素开始计数并移动到第 7 个元素。负数只有2个,间隔只有1个,所以不算循环。
示例 2:
列表(11,22,33,-25,-36,-43,20,25,28)
循环次数为3。
原因:当我们从列表的第一个元素移动到第三个元素时,我们有 2 个间隔,这意味着 2 秒。所以一个循环 当我们移动到列表的第 4 个元素时,它是一个负值。所以我们从第 4 个元素开始计数,然后移动到第 5、6 个元素。我们有 2 个间隔,这意味着 2 秒。所以一个循环 当我们移动到列表的第 7 个元素时,它是一个正值。所以我们从第 7 个元素开始计数,然后移动到第 8、9 个元素。我们有 2 个间隔,这意味着 2 秒。所以一个循环。
range 是用例中的 RDD。看起来像
scala> 范围
范围:Seq[com.Range] = List(XtreamRange(858,890,899,920,StartEngage,-758,-790,-890,-720,920,940,950))
最佳答案
您可以对此进行编码“有多少次它从负数变为正数并保持正数 >= 2 秒。如果 >= 2 秒则为一个循环。”几乎直接进入与守卫的模式匹配。表达式 if(h < 0 && ht > 0 && hht > 0)
检查循环并将结果加一,然后继续列表的其余部分。
def countCycles(xs: List[Int]): Int = xs match {
case Nil => 0
case h::ht::hht::t if(h < 0 && ht > 0 && hht > 0) => 1 + countCycles(t)
case h::t => countCycles(t)
}
scala> countCycles(range)
res7: Int = 1
关于scala - 来自值列表的循环数,在 Spark 和 Scala 中是正数和负数的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219085/