首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从scala中的val l1 = List(1,2,3,4,5,6,7)中获得结果列表结果= List(1,2,3,4,5,6,7)?

如何从scala中的val l1 = List(1,2,3,4,5,6,7)中获得结果列表结果= List(1,2,3,4,5,6,7)?
EN

Stack Overflow用户
提问于 2022-10-14 10:06:45
回答 3查看 89关注 0票数 -1

如何从列表val l1 = List(1,2,List(3,List(4,5,6),5,6,7)实现以下结果列表

result = List(1,2,3,4,5,6,7)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-14 10:21:24

以下几点都能用,

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2022-10-14 11:33:49

奇怪的是,这实际上适用于Scala 3,而且有点“类型安全”:

代码语言:javascript
运行
复制
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,这样一开始就不会出现IntList的混合。

票数 3
EN

Stack Overflow用户

发布于 2022-10-14 15:08:29

不管是什么奇怪的输入,我想在列表中对我的项目做一个通用的模式:

代码语言:javascript
运行
复制
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]))
    }
  }
}

然后给出清单如下:

代码语言:javascript
运行
复制
val l = List(1, 2, List(3, List(4, 5, 6), 5, 6, 7))

您可以解析每个值,然后使用ListItem的方法获得扁平的值:

代码语言:javascript
运行
复制
val itemizedList: List[ListItem[Int]] = l.map(ListItem.parse[Int]) 
val result = itemizedList.flatMap(_.flattenedItems).distinct 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74067680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档