加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 展平相同类型的嵌套列表

发布时间:2020-12-16 10:08:15 所属栏目:安全 来源:网络整理
导读:假设我想要展平相同类型的嵌套列表…例如 ListA(Element(A),Element(B),ListA(Element(C),Element(D)),ListB(Element(E),Element(F))) ListA包含相同类型的嵌套列表(ListA(元素(C),元素(D)))所以我想用它包含的值替换它,因此上面示例的结果应如下所示: List
假设我想要展平相同类型的嵌套列表…例如

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

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

ListA(Element(A),Element(C),Element(D),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)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读