拥有一个带有值列表的RDD,它们是正面和负面的混合。 需要根据此数据计算周期数。
例如,
val range = List(sampleRange(2020,2030,2040,2050,-1000,-1010,-1020,Starting point,-1030,2040,-1020,2050,2040,2020,end point,-1060,-1030,-1010)
上面列表中每个值之间的间隔是1秒。即,2020和2030以1秒间隔记录,依此类推。
从负数变为正数并且在> = 2秒内保持正数的次数 如果> = 2秒,则它是一个循环。
周期数:逻辑
示例1:列表(1,2,3,4,5,6,-15,-66)
周期数 1
原因:当我们从列表的第一个元素移动到第六个元素时,我们有5个间隔,这意味着5秒。一个循环。
当我们移动到列表的第6个元素时,它是负值。所以我们从第6个元素开始计数并移动到第7个元素。负值仅为2,间隔仅为1.因此不计入周期
示例2:
列表(11,22,33,-25,-36,-43,20,25,28)
周期数 3
原因:当我们从列表的第一个元素移动到第三个元素时,我们有2个间隔,这意味着2秒。所以一个循环当我们移动到列表的第四个元素时,它是一个负值。所以我们从第4个元素开始计数并移动到第5个元素。我们有2个间隔,这意味着2秒。所以一个循环当我们移动到列表的第7个元素时,它是一个正值。所以我们从第7个元素开始计数并移动到第8个,第9个元素。我们有2个间隔,这意味着2秒。一个循环。
range 是用例中的RDD。看起来像是
阶>范围
范围:Seq [com.Range] = List(XtreamRange(858,890,899,920,StartEngage,-758,-790,-890,-720,920,940,950))
答案 0 :(得分:2)
您可以对此进行编码&#34;它从负数变为正数并且在&gt; = 2秒内保持正数。如果> = 2秒则是一个循环。&#34;几乎直接进入与守卫的模式匹配。表达式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
答案 1 :(得分:1)
一个班轮
range.sliding(3).count{case f::s::t::Nil => f < 0 && s > 0 && t > 0}
这将生成长度为3的所有子序列,并计算有多少是-ve,+ ve,+ ve
推广周期长度
def countCycles(n:Int, xs:List[Int]) = xs.sliding(n+1)
.count(ys => ys.head < 0 && ys.tail.forall(_ > 0))
答案 2 :(得分:1)
以下代码可以帮助您解决查询问题。
object CycleCheck {
def main(args: Array[String]) {
var data3 = List(1, 4, 82, -2, -12, "startingpoint", -9, 32, 76,45, -98, 76, "Endpoint", -24)
var data2 = data3.map(x => getInteger(x)).filter(_ != "unknown").map(_.toString.toInt)
println(data2)
var nCycle = findNCycle(data2)
println(nCycle)
}
def getInteger(obj: Any) = obj match {
case n: Int => obj
case _ => "unknown"
}
def findNCycle(obj: List[Int]) : Int = {
var cycleCount =0
var sign = ""
var signCheck="+"
var size = obj.size - 1
var numberOfCycles=0
var i=0
for( x <- obj){
if (x < 0){
sign="-"
}
else if (x > 0){
sign="+"
}
if(signCheck.equals(sign))
cycleCount=cycleCount+1
if(!signCheck.equals(sign) && cycleCount>1){
cycleCount = 1
numberOfCycles=numberOfCycles+1
}
if(size==i && cycleCount>1)
numberOfCycles= numberOfCycles+1
if(cycleCount==1)
signCheck = sign;
i=i+1
}
return numberOfCycles
} }