[英]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.