2017-05-05 155 views
0

我有一個大問題,我有幾天試圖解決它,我希望有人能幫助我。問題如下: 我有一個列表,可以有n個元素,而是取決於元件的數量,我應該以不同的方式應用功能,例如我有以下代碼:斯卡拉遞歸列表操作

if (list.size() == 1){ 
    p = list.get(0) 
    select = new Select(schema,p) 
    println(select) 
    } else { //If list have 2 elements 
    p = list.get(0) 
    p1 = list.get(1) 
    select = new Select(schema,And(p,p1)) 
    println(select) 
    } else { //If list have 3 elements 
    p = list.get(0) 
    p1 = list.get(1) 
    p2 = list.get(2) 
    select = new Select(schema,new And(And(p,p1),p2)) 
    println(select) 
    } else { //If list have 4 elements 
    p = list.get(0) 
    p1 = list.get(1) 
    p2 = list.get(2) 
    p3 = list.get(3) 
    select = new Select(schema,new And(And(p,p1),And(p2,p3)) 
    println(select) 
    } else { //If list have 5 elements.......... and so on 

哪有避免這種條件限制,並使其發揮作用。我試着用for循環,但是我不能生成新的變量,並且我也不知道如何給And函數賦予控制權....如果你需要mor信息請讓我知道

爲了添加更多的信息,AND功能是嵌套循環連接是使用關係數據庫:

sealed abstract class Pat //patterns 
    case class And(p1: Pat, p2: Pat) extends Pat 

這有正在使用後,我得到上述條件語句的結果的另一功能。這個想法也是,我可以在列表中有n個元素,而不是一個固定數字,因此我認爲匹配不是一個選項

+0

我會開始使用else而不是其他 –

+0

或者'match'語句怎麼樣? – Simon

+0

應該處理任何大小的列表嗎?能有多於一層的嵌套布爾表達式嗎?也許你可以提供一個示例輸入和一個示例輸出 – Simon

回答

1

假設你想建立的樹層次和對象,你可以使用遞歸來你Pat對象列表轉換成嵌套And對象的二叉樹。

sealed abstract class Pat 
case class Val(v: String) extends Pat 
case class And(left: Pat, right: Pat) extends Pat 

def buildParameterTree(xs: List[Pat]): Pat = { 
    xs match { 
    case p1 :: Nil => p1 
    case p1 :: p2 :: Nil => And(p1, p2) 
    case tail => 
     val halves = tail.splitAt(tail.length/2) 
     And(buildParameterTree(halves._1), buildParameterTree(halves._2)) 
    } 
} 

用法:

scala> buildParameterTree(List("p1").map(Val)) 
res1: Pat = Val(p1) 
scala> buildParameterTree(List("p1", "p2").map(Val)) 
res2: Pat = And(Val(p1),Val(p2)) 
scala> buildParameterTree(List("p1", "p2", "p3").map(Val)) 
res3: Pat = And(Val(p1),And(Val(p2),Val(p3))) 
scala> buildParameterTree(List("p1", "p2", "p3", "p4").map(Val)) 
res4: Pat = And(And(Val(p1),Val(p2)),And(Val(p3),Val(p4))) 

等等......

有關斯卡拉match聲明和recursion更多信息,請參見相應的鏈接。

+0

嗨,非常感謝!它完美的作品! –

1

所以你想要And()列表的所有元素?這會工作嗎?

new Select(schema, list.reduce(And)) 
0
case class And(x:Any, y:Any) 

def resolveAnd(lst: List[Int]):Any = { 
    if (lst.isEmpty) throw new Exception("Invalid list provided.") 
    lst.size match { 
    case 1 => lst.head 
    case _ => { 
     val size = if(lst.size%2==0)lst.size else lst.size+1 
     And(resolveAnd(lst.take(size/2)), resolveAnd(lst.drop(size/2))) 
    } 
    } 
} 

val list = 1::2::3::4::Nil 
println(resolveAnd(list)) //output - And(And(1,2),And(3,4)) 

new Select(schema, resolveAnd(list))