2017-05-05 103 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))