繁体   English   中英

将地图迭代器映射到地图

[英]Map Iterator into map

我有以下情况:我收到某种类型的Iterator,并希望将其变成特定的映射。 我觉得可能有一种非常简单的方法来执行此操作,但是我似乎无法弄清楚:)下面的代码使事情更容易理解:(我将案例类缩短到最低限度)

case class Fu(title: String)
case class Bar(name: String)
case class Match(f: Fu, b: Bar)
case class Result(name: String, fus: List[Fu])

val input: Iterator[Match] = ...

我最后想要的是这样的:

val output: Iterator[Result]

这是棘手的部分:匹配项是唯一的,但是自然地,每个Fu都可以匹配,因此有多个Bar。 我基本上希望分解具有相同Bar的所有比赛并将其Fus放入列表中。 有点像Map [Bar,List [Fu]],除了我有一个类型。 Result类也可以使用Bars而不是名称String,但是我真的不需要其他Bar信息。 但这并不太重要。 输出类型也不是那么重要,它是Iterator,Iterable,List或其他任何东西。 只要映射正常工作。

起初,我以为Iterable上的groupBy可以完全实现我想要的功能,但是我无法弄清楚如何正确使用groupBy,或者这是该工作的错误功能:)使用map似乎是一个不错的开始,但是接下来该怎么做我建立清单? 我可以轻松地将每个Match转换成一个Result,但是最后我会得到许多同名的Result对象。

非常感谢,感谢您的帮助!

编辑:也许我应该说清楚,这与匹配字符串无关。 它们只是两个案例类的示例属性。 所有Fus和Bars已经正确匹配到Match对象中。

您与groupBy一起groupBy在正确的轨道上。 外观如下:

val input: Iterator[Match] = Iterator(
  Match(Fu("A"), Bar("1")),
  Match(Fu("B"), Bar("2")),
  Match(Fu("C"), Bar("1")),
  Match(Fu("D"), Bar("2")))

val output =
  input.toList
    .groupBy { case Match(f, Bar(name)) => name }
    .map { case (name, fus) => Result(name, fus.map(_.f)) }

 output foreach println                         //> Result(1,List(Fu(A), Fu(C)))
                                                //| Result(2,List(Fu(B), Fu(D)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM