2017-05-05 10 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関数をどのように制御するのかもわかりません。私は情報を必要とします。

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

これは私が上記の条件文の結果を取得した後に使用している他の機能があります。より多くの情報を追加し、機能は、ネストされたループは、それはリレーショナルデータベースで使用される結合です。また、リストナンバーではなく、修正番号でなくてもいいことが考えられます。

+0

elseの代わりにifを使用して開始します。 –

+0

「match」文はどうですか? – Simon

+0

これはリストの任意のサイズを処理する必要がありますか?ネストブール式の複数のレベルがありますか?おそらくあなたはサンプル入力とサンプル出力を提供することができます – Simon

答えて

1

あなたはまた、オブジェクトのツリー階層を構築したいと仮定すると、あなたは、ネストされたAndオブジェクトのバイナリツリーにPatオブジェクトのリストを変換するために再帰を使用することができます。

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