1

次のような状況があります: 特定のタイプの 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]

難しい部分は次のとおりです。一致は一意ですが、当然、各フーは複数のバーに一致する可能性があります。私は基本的に、同じバーを持つすべての試合を分解し、それらの Fus をリストに入れたいと考えています。Map[Bar, List[Fu]] のようなものですが、そのための型があることを除きます。Result クラスは String という名前の代わりに Bars を使用することもできますが、他の Bar 情報は必要ありません。しかし、それはあまり重要ではありません。また、Iterator、Iterable、List など、出力の型もそれほど重要ではありません。マッピングが適切に機能する限り。

最初は、Iterable の groupBy はまさに私がやりたいことを行うと思っていましたが、groupBy を適切に使用する方法を理解できないか、それが仕事にとって間違った機能であるかのいずれかです:) map を使用することは良いスタートのようですが、どうすれば私はリストを構築しますか?各 Match を Result に簡単に変換できますが、同じ名前の Result オブジェクトが多数作成されることになります...

どうもありがとうございました。

編集:おそらく、文字列の一致に関するものではないことを明確にする必要があります。これらは、2 つのケース クラスの属性の例にすぎません。すべての Fus と Bars は、すでに Match オブジェクトに正しく一致しています。

4

1 に答える 1

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)))
于 2012-12-18T04:40:08.030 に答える