展平相同类型的嵌套列表

2023-12-26

假设我想展平相同类型的嵌套列表......例如

    ListA(Element(A), Element(B), ListA(Element(C), Element(D)), ListB(Element(E),Element(F)))

ListA包含相同类型的嵌套列表(ListA(Element(C), Element(D)))所以我想用它包含的值替换它,所以上例的结果应该如下所示:

ListA(Element(A), Element(B), Element(C), Element(D), ListB(Element(E),Element(F)))

当前类层次结构:

abstract class SpecialList() extends Exp {
    val elements: List[Exp]
}

case class Element(name: String) extends Exp

case class ListA(elements: List[Exp]) extends SpecialList {
        override def toString(): String = "ListA("+elements.mkString(",")+")"
}

case class ListB(elements: List[Exp]) extends SpecialList {
        override def toString(): String = "ListB("+elements.mkString(",")+")"
}

object ListA{def apply(elements: Exp*):ListA = ListA(elements.toList)}
object ListB{def apply(elements: Exp*):ListB = ListB(elements.toList)}

我已经制定了三种有效的解决方案,但我认为必须有更好的方法来实现这一目标:

第一个解决方案:

def flatten[T <: SpecialList](parentList: T): List[Exp] = {
        val buf = new ListBuffer[Exp]

        for (feature <- parentList.elements) feature match {
            case listA:ListA if parentList.isInstanceOf[ListA] => buf ++= listA.elements
            case listB:ListB if parentList.isInstanceOf[ListB] => buf ++= listB.elements
            case _ => buf += feature
        }
        buf.toList
    }

第二种解决方案:

def flatten[T <: SpecialList](parentList: T): List[Exp] = {
    val buf = new ListBuffer[Exp]

    parentList match {
        case listA:ListA => for (elem <- listA.elements) elem match {
                                case listOfTypeA:ListA => buf ++= listOfTypeA.elements
                                case _ => buf += elem
                            }

        case listB:ListB => for (elem <- listB.elements) elem match {
                                case listOfTypeB:ListB => buf ++= listOfTypeB.elements
                                case _ => buf += elem
                            }
    }

    buf.toList
}

第三种解决方案

def flatten[T <: SpecialList](parentList: T): List[Exp] = parentList.elements flatMap {
    case listA:ListA if parentList.isInstanceOf[ListA] => listA.elements
    case listB:ListB if parentList.isInstanceOf[ListB] => listB.elements
    case other => List(other)
}

我的问题是是否有更好、更通用的方法来实现与上面三个解决方案相同的功能,有重复的代码?


一种真正实用的方式。不使用变量。

def flatten[A](list: List[A]): List[A] = list match {
   case Nil => Nil
   case (ls: List[A]) :: tail => flatten(ls) ::: flatten(tail)
   case h :: tail => h :: flatten(tail)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

展平相同类型的嵌套列表 的相关文章

  • 睡觉的演员?

    让演员睡觉的最佳方式是什么 我将参与者设置为代理 希望维护数据库的不同部分 包括从外部源获取数据 由于多种原因 包括不使数据库或通信过载以及一般负载问题 我希望参与者在每个操作之间休眠 我正在看大约 10 个演员对象 参与者将几乎无限地运行
  • 为什么我的 PlayFramework 应用程序出现很长的超时?

    我已经创建了一个工作应用程序 但有时当我更改内容并点击浏览器中的 重新加载 按钮时 该应用程序会永远超时 300000 毫秒或5分钟 之后我在浏览器中得到以下异常 java util concurrent TimeoutException
  • Slick中的动态查询参数(排序)

    我正在尝试将异常查询转换为平滑查询Play 2 3 示例之一 https github com playframework playframework tree 2 3 x samples scala computer database 但
  • 最近用 Java 编写的 FFTW 包装器

    我正在寻找最新版本的最小 Java 包装器FFTW http www fftw org FFTW 网站上列出的包装器要么已过时 jfftw 1 2 zip ftp ftp fftw org pub fftw jfftw 1 2 zip 或包
  • 在 Play 框架规范中设置 PhantomJSDriver 上的 Accept-Language

    如何使用 Play Framework 2 2 规范中的特定 Accept Language 语言标头配置 PhantomJSDriver 鉴于此代码 import org specs2 mutable import org specs2
  • Scala Swing 库的问题

    您好 我在 2 8 Beta1 prerelease 版本中使用 Scala Swing 库时遇到问题 我有一种情况 我想在 GUI 中显示一个表 并在 SQL 请求返 回结果时更新它 在 Scala 中可以通过哪种方式完成此操作 目前我正
  • 我在 Python 中查找重复循环的正则表达式模式有什么问题?

    我想匹配任何具有重复循环的字符串 就像这个数据一样 3333333333333333333333333333333333333333 1 digit cycle 3 1666666666666666666666666666666666666
  • scala-js 如何与 sbt-web 集成?

    我想用scala js https github com scala js scala js with sbt web https github com sbt sbt web以这样的方式 它可以被编译以生成添加到资产管道中的 JavaSc
  • 如何解析 Spray-routing 中的 get 请求参数?

    这就是代码部分的样子 get respondWithMediaType MediaTypes application json entity as HttpRequest obj gt complete println obj ok 我可以
  • 在java中使用scala包对象中的vals

    我有一个 Scala 包对象 其中声明了 vals 因此我可以使用常见的对象 而无需每次都导入它们 然而 我也想在 Java 中使用这些定义 但是 Java 不允许导入任何称为 package 的东西 它是 Scala 创建的类的名称 有没
  • 如何使用 Scala 调度获取 301 重定向中返回的 URL?

    我正在使用斯卡拉dispatch http dispatch databinder net Dispatch htmlHTTP 库 版本 0 10 1 我向返回 HTTP 301 永久重定向的 URL 发出请求 例如 http wikipe
  • Scala 类型参数推理因 Nothing 失败

    scala gt class A T defined class A scala gt class B T a A T defined class B scala gt val b new B new A Int b B Int B 1ff
  • scala.collection.Seq 不适用于 Java

    Using 阿帕奇火花2 0 1 Java 7 在 Apache Spark Java API 文档中 DataSet 类出现了一个example http spark apache org docs latest api java org
  • Twitter API 与 Scala 2.12 一起使用

    我正在使用 Scala 2 12 使用 SBT 构建 构建 Spark 3 0 0 流应用程序 鉴于所有用于执行此操作的库均适用于 Scala EDIT 我尝试使用库构建时得到的示例输出 object twitter is not a me
  • 无法向 kafka 主题发送消息

    我正在使用 Kafka Play 以及 Scala 这是我的代码 我想在其中发送消息到kafka服务器 主题名称是 测试主题 尽管我没有在主题中看到我发送的消息 但我没有收到任何错误 这里有什么问题吗 import kafka produc
  • 将案例类传递给函数参数

    抱歉问了一个简单的问题 我想将案例类传递给函数参数 并且想在函数内部进一步使用它 到目前为止我已经尝试过这个TypeTag and ClassTag但由于某种原因 我无法正确使用它 或者可能是我没有看到正确的位置 用例与此类似 case c
  • 如何使用 Apache Livy 设置 Spark 配置属性?

    我不知道在向 Apache Livy 提交 Spark 作业时如何以编程方式传递 SparkSession 参数 这是测试 Spark 作业 class Test extends Job Int override def call jc J
  • 对于基于 Play 2.0 的 Java 应用程序,我可以使用 groovy 模板代替 scala 吗?

    我是 Play 2 0 新手 我很难理解用于创建视图的 scala 模板 我可以切换回 groovy 因为它存在于早期版本的 Play 框架中 例如 播放 1 2 播放 1 2 4 是的 有一个可用于 groovy 的模块 https gi
  • PostgreSQL 对 string\varchar 的各种清理

    我必须通过以下方式清理一些 varchar 删除特殊字符 例如 来自封闭列表 我已经成功地通过大量使用replace regexp replace来做到这一点 但我正在寻找类似于SQL Server中的东西 删除以下数字但不删除相邻的数字含
  • 实施策略模式的函数式方法

    我正在尝试解决一个处理从一种温度单位到另一种温度单位 摄氏度 开尔文 华氏度 转换的问题 在Java中 我需要创建一个接口并提供多个实现来封装输入类型并将结果作为输出类型的单元返回 例如开尔文到摄氏度或摄氏度到华氏度等 我已经在 scala

随机推荐

  • Openshift 上的 Scalatra 应用 - 设置 Jetty IP

    我正在尝试使用 DIY 盒在 Openshift 上部署一个最小的 Scalatra 应用程序 我已经成功让 SBT 正常工作 但是当涉及到container start 我收到错误 FAILED SelectChannelConn ema
  • 如何设置浮动 div 的宽度以占用剩余空间而不将其他 div 向下推?

    对于我想要制作的布局的一部分 我想使用三个 div 所有 div 都彼此相邻浮动 左侧和右侧有一个最大宽度设置 效果很好 但我希望中间的 div 扩大其宽度以填充剩余空间 澄清一下 左右 div 的宽度可以是从 0px 到最大宽度的任何位置
  • 枚举,在 switch case 中使用

    我定义了一个枚举 其中包含方法返回类型 如 String Float List Double 等 我将在 switch case 语句中使用它 例如我的枚举是 public enum MethodType DOUBLE LIST STRIN
  • 在多个故事板文件之间共享场景。 iPhone 与 iPad

    我正在使用故事板开发通用应用程序 我有 2 个故事板文件 一款适用于 iPhone 一款适用于 iPad 我将有一些场景想要在两者之间共享 并且我想使用故事板编辑器来设置它们 常见的是 UITableViewController 及其原型单
  • android:来自片段的菜单项单击事件

    我有一个带有操作栏的应用程序 并且菜单因主要活动而膨胀 我想拦截片段内的点击事件 但我不知道如何 你能帮我吗 主要活动 Override public boolean onCreateOptionsMenu Menu menu getMen
  • 如何使用预测和标准获得不同的结果

    我正在尝试使用 Grails 中的条件加载不同的父级 查询如下 Query def criteria Parent createCriteria results criteria list max params max offset par
  • Google Apps 脚本 JDBC 连接问题

    我在 google apps 脚本中使用 jdbc 连接器连接到任何 mysql 数据库时遇到问题 我正在使用教程代码 var conn Jdbc getConnection jdbc mysql host or ip 3306 datab
  • Windows 10 - System.Speech.Synthesis 无法获取移动版语音

    在我的 Windows 10 语言中 我安装了 2 个英语版本 US 英国 因此 在 设置 gt 时间和语言 gt 语音 中 在 文本转语音 部分下 我可以看到以下选项 微软大卫移动 微软乔治移动 微软苏珊移动 微软榛子移动 微软 Zira
  • 将 PDF 插入 Excel、Python

    我编写了一个 python 脚本 用于创建包含各种计算的电子表格 我想进一步将 pdf 插入电子表格 pdf 是理想的 但 jpeg 也可用 我翻遍了xlwt 没有找到任何东西 谁能建议一种方法来实现这一目标 要实际插入 PDF 您可能只需
  • 为瘦服务器和 sinatra 启用 SSL

    我正在尝试为我的瘦服务器 Web 应用程序启用 SSL 以便它可以通过 HTTPS 运行 我已完成以下操作 启动瘦网络服务器 我的应用程序 运行 主机 gt 127 0 0 1 端口 gt 9090 sslenable gt true ss
  • 使用ADT和SDK管理器,将android源代码附加到eclipse

    安装ADT后 我使用SDK Manager下载最新的android API的源代码 现在 当我运行ADT附带的Eclipse版本时 我仍然看不到android源代码 有没有简单的方法来解决这个问题 打开SDK Manager gt 在api
  • 如何在运行时从 NUnit 测试运行中获取单元测试方法属性?

    我将有关给定测试的各种信息 多个错误跟踪系统的 ID 存储在属性中 如下所示 TestCaseVersion 001 B 8345 X543 public void TestSomethingOrOther 为了在测试过程中获取这些信息 我
  • 如何以编程方式为视图分配 ID?

    在 XML 文件中 我们可以为视图分配一个 ID 例如android id id something 然后打电话findViewById 但是当以编程方式创建视图时 如何分配 ID I think setId 与默认分配不同 setId 是
  • 使用动态而不是反射来按名称调用方法

    使用 NET 4 0 我将如何使用 Dynamic 来完成以下任务而不使用反射 public void InvokeMethod string methodName Type t typeof GCS WebService GCS WebS
  • 如何从为结果启动的活动返回字符串

    我已经启动了结果活动 但如何从该活动返回类似参数的字符串 只需使用以下代码块 Intent intent new Intent intent putExtra RESULT STRING string setResult RESULT OK
  • 通过点击图像(jquery 或 javascript)动态生成地图区域坐标

    我想知道是否有一种方法可以通过单击图像的某些部分来动态生成地图区域坐标 这是为了生成完整的图像图 举个例子 我有这张图片 单击此处查看图像 http mauricio lairet es otr plano jpg 通过单击它 我想为每个定
  • 切片类型的切片

    我目前正在努力通过优秀的围棋之旅 https tour golang org 我使用以下解决方案完成了其中一项练习 45 func Pic dx dy int uint8 pic make uint8 dy type declaration
  • 使用带有大 int 的 cython 时出现 OverflowError

    python 3 4 Windows 10 cython 0 21 1 我正在用 cython 将此函数编译为 c def weakchecksum data Generates a weak checksum from an iterab
  • 将字体大小转换为英寸

    我需要在之间进行转换Drawing Font Size 浮动 和 WPFFontSize 双精度 WPF 像素 最后 我决定将字体大小 以英寸为单位 存储在数据库中 如何将 GDI FontSize 转换为英寸 将 WPF FontSize
  • 展平相同类型的嵌套列表

    假设我想展平相同类型的嵌套列表 例如 ListA Element A Element B ListA Element C Element D ListB Element E Element F ListA包含相同类型的嵌套列表 ListA