gpt4 book ai didi

scala - 将 List[Task(username, description)] 转换为 Map[username,Set[Task]]

转载 作者:行者123 更新时间:2023-12-01 11:47:41 30 4
gpt4 key购买 nike

(注意我是 Scala 的新手,仍然在为集合操作的最常见操作而苦苦挣扎。)

我想将 List[Task] 转换为 Map。以下是一些详细信息:

// assignee may be null
case class Task(assignee: String, description: String)
// might refactor it into:
// case class Task(assignee: Option[String], description: String)

我想要一个 Map,其中 Keys 是受让人,每个 Value 是一个 Set[Task]。我在处理以下两种情况时遇到问题:

  • Map 对 null 键不(咳嗽)友好(咳嗽)(我使用 Option[String] 作为受让人来解决这个问题)和
  • 必须区分 Key 是否已经存在于映射中(仅向现有集合添加值)与已经添加的键以便 Set 值存在

我想出了以下内容,但它看起来过于冗长。

def groupByAssignee(tasks : List[Task]) : Map[Option[String], Set[Task]] = {
tasks.foldLeft(Map[Option[String], Set[Task]]())(
(m, t) => {
m.get(t.assignee) match {
case Some(_) => m + ((t.assignee, m.get(t.assignee).get.+(t)))
case _ => m + ((t.assignee, Set(t)))
}
})
}

实现此目标的更简单/更清晰的方法是什么?

谢谢!

最佳答案

这个用例非常常见,因此有一个内置方法:

tasks groupBy {_.assignee}

groupBy 但是,当您需要 .Map[String, Set[String]] 时,它会返回 Map[String,List[Task]] .应该这样做:

groupBy {_.assignee} mapValues {_ map {_.description} toSet}

groupBYnull 友好的,但您不应该这样。 Option[String] 更好也更惯用。

关于scala - 将 List[Task(username, description)] 转换为 Map[username,Set[Task]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14424244/

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