2016-08-30 15 views
0

使RDD具有值列表,它們是正數和負數的組合。 需要根據這些數據計算週期數。Spark和Scala中正數和負數混合的值列表中的循環數

例如,

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)
週期的編號爲。
原因:當我們從列表的第一個元素移動到第六個元素時,我們有5個間隔,這意味着5秒。所以一個週期。 當我們移動到列表的第6個元素時,它是一個負值。所以我們從第6個元素開始計數並移動到第7個元素。負值僅爲2,間隔僅爲1.因此,不計爲循環。
實施例2:
列表(11,22,33,-25,-36,-43,20,25,28)
週期號是。
原因:當我們從列表的第一個元素移動到第三個元素時,我們有2個間隔,這意味着2秒。所以一個週期當我們移動到列表的第四個元素時,它是一個負值。所以我們從第四元素開始計算,移動到第五元素,第六元素。我們有2個間隔,這意味着2秒。所以一個週期當我們移動到列表的第7個元素時,它是一個正值。所以我們從第7個元素開始計數,移動到第8個元素,第9個元素。我們有2個間隔,這意味着2秒。所以一個週期。

範圍是用例中的RDD。它看起來像
斯卡拉>範圍
範圍:序號[com.Range] =名單(XtreamRange(858890899920,StartEngage,-758,-790,-890,-720,920,940,950))

+0

看起來應該是在這裏循環右'-1020,2050,2040,2020,'? – Brian

+0

它是一個示例數據。列表中的值是隨機的,沒有模式。 val range = list(17850,17860,17859,17870,-17860,-17859,-17870,2020,2030,2040,2050,-1000,-1010,-1020,-1030,2040,-1020,2050,2040 ,2020,-1060,-1030,-1010) – Phani

+0

週期總是被定義爲正值兩秒?或者可能會有所不同? –

回答

1

您可以編碼本「如何很多時候它會從負面轉向正面並保持正面> 2秒,如果> = 2秒,這是一個週期。「非常直接地與守衛進行模式匹配。表達式if(h < 0 && ht > 0 && hht > 0)檢查一個循環,並將結果加1,然後繼續列表的其餘部分。

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

甲一個襯裏

range.sliding(3).count{case f::s::t::Nil => f < 0 && s > 0 && t > 0} 

這產生一個長度爲3的所有子序列和計數有多少-ve,陽離子,陽離子

要概括週期長度

def countCycles(n:Int, xs:List[Int]) = xs.sliding(n+1) 
             .count(ys => ys.head < 0 && ys.tail.forall(_ > 0)) 
0

以下代碼將幫助您解決您的查詢問題。

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 

}}