2017-01-16 2 views
0

J'ai une en constante mise à jour mutable.HashMap[String, String] avec un enregistrement des emplacements des utilisateurs actuels:carte Scala cooccurrence compte

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

Je veux garder une trace de l'emplacement cooccurrences entre les utilisateurs - qui est, combien fois chaque paire d'utilisateurs a été au même endroit. Le format que j'ai à l'esprit est un mutable.HashMap[(String, String), Int]:

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

Chaque fois que les mises à jour de carte de localisation des utilisateurs, je veux revoir quels sont les utilisateurs et ajouter 1 à leur compte courant de cooccurrences.

Le code ci-dessous renvoie une carte de {location -> Array (users)}, ce qui semble être une bonne première étape.

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

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

J'utilise scala 2.11.8.

Répondre

3

Utilisez le subsets(2) pour obtenir toutes les combinaisons de keys et comparer si égal à générer une nouvelle carte, comme:

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)