Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带条件列表的Scala分布_Scala_List_Recursion_Combinations - Fatal编程技术网

带条件列表的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)解决了这个问题