【问题标题】:Filter out elements by comparing a list of strings and a map通过比较字符串列表和映射来过滤元素
【发布时间】:2021-06-03 15:03:37
【问题描述】:

我有两个函数,它们获取字符串列表和映射作为参数并返回整数列表。如图:

def f1(names: List[String], namemap: Map[String, List[Int]]): List[Int] = 

def f2(names: List[String], namemap: Map[String, List[Int]]): List[Int] =

为了让下面的解释更容易理解,这里举个例子:

val nameslist = List("alex", "toby")

val namesmap = Map("sarah" -> List(5), "toby" -> List(6), "alex" -> List(1, 6))

println(f1(nameslist, namesmap))
//should print: List(6,1)
println(f2(nameslist, namesmap))
//should print: List(6)

函数f1 应该“比较”吗?列表namelist 中的字符串与映射namesmap 中的字符串,并返回找到字符串的namesmap 中的所有整数值。

函数f2 应该只返回在两个字符串中都找到的整数。

【问题讨论】:

  • 你尝试过什么来解决这个问题?你能给我们你的部分解决方案吗?谢谢:)
  • 这是我第一次处理这种问题,我很迷茫从哪里开始!关于我应该研究什么的任何提示?
  • 在名称 Map 中使用名称 ListgetOrElse 上的 mapfoldLeft 很容易解决;检查Scaladoc。另外,您想检查 Set 类;)

标签: scala


【解决方案1】:

这应该会有所帮助。

val nameslist = List("alex", "toby", "jo")
val namesmap =
  Map("sarah" -> List(5), "toby" -> List(6), "alex" -> List(1, 6))

nameslist.flatMap(namesmap.get)  //List[List[Int]]
         .flatten                //List[Int]
         .distinct               //duplicates removed
//res0: List[Int] = List(1, 6)

nameslist.flatMap(namesmap.get)       //List[List[Int]]
         .reduceOption(_ intersect _) //Option[List[Int]]
         .getOrElse(Nil)              //List[Int]
//res1: List[Int] = List(6)

【讨论】:

  • 这很好!谢谢大佬!唯一的问题是,当我尝试f2(List("alex", "jo"),namesmap)时,它仍然返回List (1,6),即使"jo"namesmap 中不存在
  • 我想通了!谢谢! if (nameslist.map(namesmap.get).forall(_.isDefined)) ... else List()
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2023-03-23
相关资源
最近更新 更多