带条件列表的Scala分布
所以,它非常简单,我有一个嵌套列表的列表,如下所示:带条件列表的Scala分布,scala,list,recursion,combinations,Scala,List,Recursion,Combinations,所以,它非常简单,我有一个嵌套列表的列表,如下所示: List( *list1* List(List("n1", "n3"), List("n1", "n4"), List("n3", "n4")), *list2* List(List("n2"), List("n3"), List("n4")) ) List( List(List(n1, n3), List(n2)), List(List(n1, n4), List(n2)), List(List(n3, n4), List(n2))
List(
*list1* List(List("n1", "n3"), List("n1", "n4"), List("n3", "n4")),
*list2* List(List("n2"), List("n3"), List("n4"))
)
List(
List(List(n1, n3), List(n2)),
List(List(n1, n4), List(n2)),
List(List(n3, n4), List(n2)),
List(List(n1, n3), List(n3)),
List(List(n1, n4), List(n3)),
List(List(n3, n4), List(n3)),
List(List(n1, n3), List(n4)),
List(List(n1, n4), List(n4)),
List(List(n3, n4), List(n4))
)
def combinationList[T](ls:List[List[T]]):List[List[T]] = ls match {
case Nil => Nil::Nil
case head :: tail => val rec = combinationList[T](tail)
rec.flatMap(r => head.filter(x => !r.contains(x)).map(t => t::r))
}
我想用列表2的列表来分发列表1的列表,如下所示:
List(
*list1* List(List("n1", "n3"), List("n1", "n4"), List("n3", "n4")),
*list2* List(List("n2"), List("n3"), List("n4"))
)
List(
List(List(n1, n3), List(n2)),
List(List(n1, n4), List(n2)),
List(List(n3, n4), List(n2)),
List(List(n1, n3), List(n3)),
List(List(n1, n4), List(n3)),
List(List(n3, n4), List(n3)),
List(List(n1, n3), List(n4)),
List(List(n1, n4), List(n4)),
List(List(n3, n4), List(n4))
)
def combinationList[T](ls:List[List[T]]):List[List[T]] = ls match {
case Nil => Nil::Nil
case head :: tail => val rec = combinationList[T](tail)
rec.flatMap(r => head.filter(x => !r.contains(x)).map(t => t::r))
}
这可以通过以下功能实现:
def combinationList[T](ls:List[List[T]]):List[List[T]] = ls match {
case Nil => Nil::Nil
case head :: tail => val rec = combinationList[T](tail)
rec.flatMap(r => head.map(t => t::r))
}
问题是,我想添加一个条件,其中我只分发不存在重复项的列表,因此结果将是:
List(
List(List(n1, n3), List(n2)),
List(List(n1, n4), List(n2)),
List(List(n3, n4), List(n2)),
List(List(n1, n4), List(n3)),
List(List(n1, n3), List(n4)),
)
最接近的方法是在映射之前添加一个过滤器和一个contains,但仍然无法得到结果,如下所示:
List(
*list1* List(List("n1", "n3"), List("n1", "n4"), List("n3", "n4")),
*list2* List(List("n2"), List("n3"), List("n4"))
)
List(
List(List(n1, n3), List(n2)),
List(List(n1, n4), List(n2)),
List(List(n3, n4), List(n2)),
List(List(n1, n3), List(n3)),
List(List(n1, n4), List(n3)),
List(List(n3, n4), List(n3)),
List(List(n1, n3), List(n4)),
List(List(n1, n4), List(n4)),
List(List(n3, n4), List(n4))
)
def combinationList[T](ls:List[List[T]]):List[List[T]] = ls match {
case Nil => Nil::Nil
case head :: tail => val rec = combinationList[T](tail)
rec.flatMap(r => head.filter(x => !r.contains(x)).map(t => t::r))
}
问题是,我认为这是将列表作为一个整体进行比较,而不是单个元素。有什么想法吗
编辑:我需要忽略函数中的重复项。我知道可以对信息进行后期处理并删除重复的信息,但这不是我想要的。您需要进一步分解一个级别以检查项目是否存在,最简单的形式如下:
def combinationList[T](ls:List[List[List[T]]]) : List[List[List[T]]] = ls match {
case head :: tail :: Nil =>
for {
hl <- head
tl <- tail
if !tl.forall(te => hl.contains(te))
} yield List(hl, tl)
}
def组合列表[T](ls:List[List[List[T]]]):List[List[List[T]]]=ls匹配{
案例头部::尾部::无=>
为了{
hl对于当前的返回类型,您可能需要再次匹配才能“查看”列表。类似的操作可能会完成以下任务:
def combinationList[T](ls:List[List[T]]):List[List[T]] = ls match {
case Nil => Nil::Nil
case head :: tail => val rec = combinationList[T](tail)
rec.flatMap(r => head.filter {
case xx: List[_] => {
val combined = (xx.map(List(_)) ++ r)
combined.distinct == combined
}
}.map(t => t::r))
}
您的函数接收到一个List[List[T]],但我的函数接收到的不是这个,所以即使在我的示例中,它也不起作用。您的输入肯定是一个List[List[T]]
。应该很清楚:如果List[List[T]]
或者List[List[T]],则是两个
。毕竟,演示的代码是关于想法的。我做了一些更改,并使其生效。根据您的解决方案,因此我将标记为已回答。如果您想知道,则“!”应该在hl.contains(te)之前不管怎样,你的解决方案基本上解决了我的问题,非常感谢!我现在有一个例外。如果我的输入类似于列表(列表(列表(n1),列表(n3),列表(n4)),列表(列表(n2),列表(n3),列表(n4)),它工作正常,但如果它只是列表(列表(列表(n1),列表(n3),列表(n4)))它不工作,它给出了一个匹配错误异常。有什么想法吗?同时,我通过添加一个额外的case:case head::Nil=>for(x)解决了这个问题