【问题标题】:How best to filter a Seq[Object] by a Map[String, Int] in Scala?如何最好地通过 Scala 中的 Map[String, Int] 过滤 Seq[Object]?
【发布时间】:2017-07-14 08:09:15
【问题描述】:

我正在尝试过滤包含对象的 Seq[Object] Map[objectid: String, Int] 其中 Object.id 是 Map 中的一个键。

我想返回一个新的 Map ,其中只包含 id 在原始地图中的对象及其 Int 值。所以函数应该返回 Map[Object, Int]

这是我到目前为止所拥有的?实现这一目标的最佳方法是什么?

val peopleObjects[Person] = Seq[person1, person2, person3]

val peopleMap[String, Int] = Map[PersonId, Int]

peopleObjects.filter(person[Person] => peopleMap.contains)

【问题讨论】:

  • 我假设您遇到了编译错误,因为这不是有效的 scala。从修复它们开始(或在需要帮助时发布它们)。

标签: scala data-structures


【解决方案1】:

我会采取稍微不同的方法。借用@jwvh:

case class Person(id: Int, name: String)
val tom = Person(4, "tom")
val jan = Person(2, "jan")
val people: Future[Set[Person]] = Future.successful(Set(tom, jan))

val peopleMap = people.map { set =>
   set.map(p => (p -> p.id))(breakOut)
}

基本上我认为案例类,尤其是breakOut,在这里非常有用。

【讨论】:

    【解决方案2】:

    您的命名选择有点混乱。我试图让它更清楚一点,但如果idString,则不清楚Int 代表什么。

    class Person(val id: String) {}
    val (tom, jan) = (new Person("tom"), new Person("jan"))
    val persons = Seq[Person](tom, jan)
    
    val idMap = Map[String, Int]("tom"->4, "jan"->2)
    
    val personMap = persons.filter(p => idMap.contains(p.id))
                           .map(p => p->idMap(p.id))
                           .toMap
    personMap(jan)  // res0: Int = 2
    

    【讨论】:

    • 非常感谢您让这一点更清楚,如果 Person Seq 现在是 Future[Seq[Person]] 我还需要做什么?
    • 使用map() 查看Future 内部。进入后,您可以添加对未来最终结果的进一步处理。
    • @jwvh val (tom,jan) 是什么?
    • 在 Scala 中,您可以使用模式匹配来一次创建和初始化多个变量。当编译器看到这个val (x,y,z)=(3,5,2) 时,它会通过在左侧的元组中创建三个变量来匹配右侧的元组。试试看。
    猜你喜欢
    • 2022-08-23
    • 2017-02-27
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多