如何在Scala中将Seq [Object]转换为Map [User,Set [String]

时间:2018-07-12 21:36:59

标签: scala

标题真的很难解释,但这是我想做的。

我对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)
          })
        }
      })

1 个答案:

答案 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将产生的兴趣爱好列表转换为一组兴趣爱好