在scala中将列表列表展平为一组,但有异常

在scala中将列表列表展平为一组,但有异常,scala,functional-programming,nested-lists,Scala,Functional Programming,Nested Lists,这感觉像是一个特殊的问题,我对Scala非常陌生,所以我不知道如何提出正确的问题,以便在这个问题上取得进展 作为演示,假设我有一个如下列表: val data = List(List(1, 2, 3, 4), List(1, 2, 2, 3, 4), List(1, 2, 3, 3, 3, 4), List(1, 2, 3, 4), List(2, 3, 4)) data.flatten.groupBy(k => k).mapValues(_.size).toList.sortBy(_.

这感觉像是一个特殊的问题,我对Scala非常陌生,所以我不知道如何提出正确的问题,以便在这个问题上取得进展

作为演示,假设我有一个如下列表:

val data = List(List(1, 2, 3, 4), List(1, 2, 2, 3, 4), List(1, 2, 3, 3, 3, 4), List(1, 2, 3, 4), List(2, 3, 4))
data.flatten.groupBy(k => k).mapValues(_.size).toList.sortBy(_._2).map(_._1)
我希望能够把它简化为一个整数列表,它看起来更像是一组不同的多个列表,但有一个例外:每个列表都有多个整数,我希望在最后的列表中表示它们。因此,作为一般规则,该整数表示最多的列表将在最终列表中重复该整数。因此,理想的情况是:

List(1, 2, 2, 3, 3, 3, 4)
我知道我可以做data.flant.distinct并获得:

List(1, 2, 3, 4)
但这不是我想要的,我知道可能还有更多的工作要做,以达到预期的结果


我想知道是否有一种很好的方法可以在scala中以功能化的方式实现所需的结果。

我不太明白,但您可以对元素进行排序

data.flatten.sorted
那会给你什么

List(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4)
如果您想按遭遇次数排序,可以这样做:

val data = List(List(1, 2, 3, 4), List(1, 2, 2, 3, 4), List(1, 2, 3, 3, 3, 4), List(1, 2, 3, 4), List(2, 3, 4))
data.flatten.groupBy(k => k).mapValues(_.size).toList.sortBy(_._2).map(_._1)
那会给你什么

List(1, 4, 2, 3)
试试这个

val data = List(List(1, 2, 3, 4), List(1, 2, 2, 3, 4), List(1, 2, 3, 3, 3, 4), List(1, 2, 3, 4), List(2, 3, 4))

val map = data.map(_.groupBy(identity)).foldLeft(Map[Int, List[Int]]()) {
   case (r, c) => r ++ c.map {
       case (k, v) => k -> (if (v.size > r.getOrElse(k, List()).size) v else r(k))
}
}.values.flatten                               
//> map  : Iterable[Int] = List(2, 2, 4, 1, 3, 3, 3)
它不能维持秩序。在此之后,您可以调用对其进行排序

也许这更干净

data.flatMap(_.groupBy(identity)).groupBy(_._1).mapValues(_.sortBy(_._2.size).reverse(0)._2).values.flatten
//> res0: Iterable[Int] = List(2, 2, 4, 1, 3, 3, 3)

您必须告诉我们是否希望结果按列表排序。否则,您正在搜索的是所谓的多集。它不必按顺序出现,但我希望能够在某个时候进行排序。我会看一下多组测试,这些工作。现在我只需要看看他们,了解他们在做什么;哈哈,第一个更容易理解。如果需要帮助,请发表评论: