标题真的很难解释,但这是我想做的。
我对Scala还是很陌生。我有一个对象User
,它只是一个用户,给定相同的用户ID,两个用户可以相等
case class UserCustomFeature(
hobby: String,
users: Set[User]
) {}
我的输入是Seq[UserCustomFeature]
,因此基本上是一个爱好的对象列表->用户。例如,
[('tv' -> Set('user1', 'user2')),
('swimming' -> Set('user2', 'user3'))]
我希望结果是
('user1' -> Set('tv')),
('user2' -> Set('tv', 'swimming')),
('user3' -> Set('swimming'))
到目前为止,我有类似的内容,但是我不确定以后如何将它们分组
userHobbyMap
.map({
case (hobby, users) => {
users.map(user => {
(user, hobby)
})
}
})
答案 0 :(得分:4)
case class User(id: String)
case class UserCustomFeature(
hobby: String,
users: Set[User]
) {}
val input = Seq(
UserCustomFeature("tv", Set(User("1"), User("2"))),
UserCustomFeature("swimming", Set(User("2"), User("3")))
)
val output = (for (UserCustomFeature(h, us) <- input; u <- us) yield (u, h))
.groupBy(_._1)
.mapValues(_.map(_._2).toSet)
output foreach println
生成输出:
(User(1),Set(tv))
(User(3),Set(swimming))
(User(2),Set(tv, swimming))
简要说明:
for
-综合将UserCustomFeature
的序列转置为(user, hobby)
对的列表。groupBy
按用户(第一部分)分组兴趣map(_._2)
从分组对中删除冗余用户ID toSet
将产生的兴趣爱好列表转换为一组兴趣爱好