将Iterator映射到地图中

Tim*_*Tim 1 iterator scala

我有以下情况:我收到某种类型的迭代器,并希望将其转换为特定的地图.我觉得可能有一种非常简单的方法可以做到这一点,但我似乎无法弄明白:)这里有一些代码可以让事情更容易理解:(我将案例类缩短到最低限度)

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] = ...
Run Code Online (Sandbox Code Playgroud)

我最终想要的是这样的:

val output: Iterator[Result]
Run Code Online (Sandbox Code Playgroud)

这是一个棘手的部分:比赛是独一无二的,但很自然地,每个比赛都可以匹配多个比赛.我基本上希望所有具有相同Bar的匹配都被反汇编,并将他们的Fus放入列表中.有点像地图[Bar,List [Fu]],除了我有一个类型.Result类也可以使用Bars而不是名称String,但我真的不需要其他Bar信息.但这并不重要.并且输出类型也不是那么重要,无论是Iterator,Iterable,List还是其他任何东西.只要映射正常工作.

起初,我认为groupBy on Iterable会完全按照我的要求行事,但我可能要么不弄清楚如何正确使用groupBy或者它是错误的工作函数:)使用map似乎是一个好的开始,但那么怎么做我建立名单?我可以轻松地将每个Match转换为Result,但之后我会得到许多具有相同名称的Result对象...

非常感谢,任何帮助表示赞赏!

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

dhg*_*dhg 5

你走在正确的轨道上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)))
Run Code Online (Sandbox Code Playgroud)