Scala 地图共现计数

Scala map co-occurence counts

我有一个不断更新的mutable.HashMap[String, String]记录当前用户位置:

{user1 -> location1,
 user2 -> location4,
 user3 -> location4}

我想跟踪用户之间的位置共现 - 即每对用户出现在同一位置的次数。我想到的格式是 mutable.HashMap[(String, String), Int]:

{(user1, user2) -> 0,
 (user1, user3) -> 0,
 (user2, user3) -> 1}

每次用户位置图更新时,我想重新检查哪些用户在一起并将他们的 运行 共现计数加 1。

下面的代码 returns {location -> Array(users)} 的地图,感觉这是一个很好的第一步。

var users_by_location = user_locations.groupBy(_._2).mapValues{s => s.map{ case(user, location) => user}}

> {location1 -> Array(user1), location4 -> Array(user2, user3)}

我正在使用 scala 2.11.8。

利用subsets(2)得到keys的所有组合,比较是否相等,生成新图,如:

val m = Map("user1" -> "location1", "user2" -> "location2", "user3" -> "location2")
val result = m.keySet.subsets(2).map(_.toList).map(i => (i.head, i(1))).map(i => if (m.get(i._1) == m.get(i._2)) (i, 1) else (i, 0)).toMap
println(result)
> Map((user1,user2) -> 0, (user1,user3) -> 0, (user2,user3) -> 1)