将Iterator映射到地图中

时间:2012-12-18 04:31:59

标签: scala 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]

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

起初,我认为groupBy on Iterable会完全符合我的要求,但我可能无法弄清楚如何正确使用groupBy或者它是错误的工作函数:) 使用map似乎是一个好的开始,但那我如何构建列表呢?我可以轻松地将每个Match转换为Result,但最后我会得到许多具有相同名称的Result对象......

非常感谢,感谢任何帮助!

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

1 个答案:

答案 0 :(得分: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)))