如何从列表val l1 = List(1,2,List(3,List(4,5,6),5,6,7)实现以下结果列表
result = List(1,2,3,4,5,6,7)
发布于 2022-10-14 10:21:24
以下几点都能用,
def flattenOps(l1: List[Any]): List[Int] = l1 match {
case head :: tail => head match {
case ls: List[_] => flattenOps(ls) ::: flattenOps(tail)
case i: Int => i :: flattenOps(tail)
}
case Nil => Nil
}
flattenOps(l1).distinct发布于 2022-10-14 11:33:49
奇怪的是,这实际上适用于Scala 3,而且有点“类型安全”:
type NestedList[A] = A match {
case Int => Int | List[NestedList[Int]]
case _ => A | List[NestedList[A]]
}
val input: NestedList[Int] = List(1,2,List(3,List(4,5,6),5,6,7))
def flattenNested[A](nested: NestedList[A]): List[A] =
nested match
case xs: List[NestedList[A]] => xs.flatMap(flattenNested)
case x: A => List(x)
val result: List[Int] = flattenNested(input)
println(result.distinct)不过,我觉得这更像是一种好奇,但感觉还是挺没劲的。另见在这里讨论。与现在一样,最好将输入数据正确地建模为enum,这样一开始就不会出现Int和List的混合。
发布于 2022-10-14 15:08:29
不管是什么奇怪的输入,我想在列表中对我的项目做一个通用的模式:
import scala.reflec.ClassTag
sealed trait ListItem[A] {
def flattenedItems: List[A]
}
case class SingleItem[A](value: A) extends ListItem[A] {
def flattenedItems: List[A] = value :: Nil
}
case class NestedItems[A](values: List[ListItem[A]]) extends ListItem[A] {
def flattenedItems: List[A] = values.flatMap(_.flattenedItems)
}
// The above would probably take much less lines of code in Scala 3
object ListItem {
def parse[A : ClassTag](value: Any): ListItem[A] = {
value match {
case single: A => SingleItem(single)
case nested: List[Any] => NestedItems(nested.map(parse[A]))
}
}
}然后给出清单如下:
val l = List(1, 2, List(3, List(4, 5, 6), 5, 6, 7))您可以解析每个值,然后使用ListItem的方法获得扁平的值:
val itemizedList: List[ListItem[Int]] = l.map(ListItem.parse[Int])
val result = itemizedList.flatMap(_.flattenedItems).distinct https://stackoverflow.com/questions/74067680
复制相似问题