值列表中的循环数,在 Spark 和 Scala 中混合了正数和负数
Posted
技术标签:
【中文标题】值列表中的循环数,在 Spark 和 Scala 中混合了正数和负数【英文标题】:Number of Cycles from list of values, which are mix of positives and negatives in Spark and Scala 【发布时间】:2016-08-30 05:03:46 【问题描述】:有一个包含正负混合的值列表的 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: List(1,2,3,4,5,6,-15,-66) 周期数为 1。 原因:当我们从列表的第 1 个元素移动到第 6 个元素时,我们有 5 个间隔,这意味着 5 秒。就这样一个循环。 当我们移动到列表的第 6 个元素时,它是一个负值。所以我们从第 6 个元素开始计数,然后移到第 7 个元素。负值只有 2,interval 也只有 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))
【问题讨论】:
看来这里应该是 on cycle 吧-1020,2050,2040,2020,
?
它是一个示例数据。列表中的值是随机的,没有这样的模式。 val 范围 = 列表(17850,17860,17859,17870,-17860,-17859,-17870,2020,2030,2040,2050,-1000,-1010,-1020,-1030,2040,-1020,2050,2040 ,2020,-1060,-1030,-1010)
一个循环是否总是被定义为两秒为正?或者这可能会有所不同?
另外,在您的实际用例中,range
是RDD
,对吧?不是List
?这可能会改变事情
循环数:逻辑示例 1:List(1,2,3,4,5,6,-15,-66) 循环数为 1。原因:当我们从第一个开始移动时列表的元素到第 6 个元素,我们有 5 个间隔,这意味着 5 秒。就这样一个循环。当我们移动到列表的第 6 个元素时,它是一个负值。所以我们从第 6 个元素开始计数,然后移到第 7 个元素。负数只有2,interval只有1,所以不算循环。
【参考方案1】:
您可以将此编码为“从负数变为正数并保持正数 >= 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
【讨论】:
【参考方案2】:单排
range.sliding(3).countcase 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))
【讨论】:
【参考方案3】:以下代码将帮助您解决查询。
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
【讨论】:
以上是关于值列表中的循环数,在 Spark 和 Scala 中混合了正数和负数的主要内容,如果未能解决你的问题,请参考以下文章