"a@b.com", "背景"-> Map("语言"-> "英语")) 我有一个数组arr = Array("backgroun-6ren">
gpt4 book ai didi

Scala - 减少/向左折叠

转载 作者:行者123 更新时间:2023-12-03 00:59:32 27 4
gpt4 key购买 nike

我有一个嵌套 map m,如下所示:

m = Map("电子邮件"-> "a@b.com", "背景"-> Map("语言"-> "英语"))

我有一个数组arr = Array("background","language")

如何向左折叠/缩小数组并从 map 中找到字符串“english”。我试过这个:

arr.foldLeft(m) { (acc,x) => acc.get(x) }

但我收到此错误:

<console>:10: error: type mismatch;
found : Option[java.lang.Object]
required: scala.collection.immutable.Map[java.lang.String,java.lang.Object]
arr.foldLeft(m) { (acc,x) => acc.get(x) }

最佳答案

您应该注意类型。在这里,您从 m : Map[String, Any] 作为您的 acc 开始。您与字符串 x 组合并调用 get,它返回一个 Option[Object]。要继续,您必须检查是否存在一个值,检查该值是否为 Map,强制转换(由于类型删除而未检查,因此很危险)。

我认为错误在于您的结构类型 Map[String, Any] 代表的内容相当糟糕。

假设你这样做

sealed trait Tree
case class Node(items: Map[String, Tree]) extends Tree
case class Leaf(s: String) extends Tree

您可以添加一些助手来轻松声明树

object Tree {
implicit def fromString(s: String) = Leaf(s)
implicit def fromNamedString(nameAndValue: (String, String))
= (nameAndValue._1, Leaf(nameAndValue._2))
}
object Node {
def apply(items: (String, Tree)*) : Node = Node(Map(items: _*))
}

然后声明树就像第一个版本一样简单,但类型更加精确

m = Node("email" -> "a@b.com", "background" -> Node("language" -> "english"))

然后您可以添加方法,例如在trait Tree中添加方法

  def get(path: String*) : Option[Tree] = {
if (path.isEmpty) Some(this)
else this match {
case Leaf(_) => None
case Node(map) => map.get(path.head).flatMap(_.get(path.tail: _*))
}
}
def getLeaf(path: String*): Option[String]
= get(path: _*).collect{case Leaf(s) =>s}

或者如果你更愿意折叠起来

  def get(path: String*) = path.foldLeft[Option[Tree]](Some(this)) {
case (Some(Node(map)), p) => map.get(p)
case _ => None
}

关于Scala - 减少/向左折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com