簡體   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