值列表中的循环数,它们是Spark和Scala中正面和负面的混合

时间:2016-08-30 05:03:46

标签: scala hadoop apache-spark bigdata

拥有一个带有值列表的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))

3 个答案:

答案 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  

} }