hadoop—值列表中的循环数,这些值是spark和scala中正负值的混合

nafvub8i  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(365)

有一个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个元素时,它是一个负值。所以我们从第六元素开始数到第七元素。负值仅为2,间隔仅为1。所以不算循环。
例2:
列表(11,22,33,-25,-36,-43,20,25,28)
循环次数为3。
原因:当我们从列表的第一个元素移到第三个元素时,我们有两个间隔,也就是2秒。所以当我们移动到列表的第四个元素时,它是一个负值。所以我们从第四元素开始数到第五,第六元素。我们有2个间歇,也就是2秒。所以当我们移动到列表的第7个元素时,它是一个正值。所以我们从第七元素开始数到第八,第九元素。我们有2个间歇,也就是2秒。所以一个周期。
范围是用例中的rdd。看起来像
scala>范围
范围:seq[com.range]=list(xtreamrange(858890899920,startengage,-758,-790,-890,-7209209450))

gfttwv5a

gfttwv5a1#

一行

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))
kgsdhlau

kgsdhlau2#

下面的代码将帮助您解决您的查询。

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

} }

xmjla07d

xmjla07d3#

您可以将其编码为“它从负变为正并保持正持续>=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

相关问题