2017-01-16 5 views
0

をカウントし、私は、現在のユーザーの位置の記録と絶えず更新mutable.HashMap[String, String]を持っている:Scalaのマップの共同出現は

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

私は、ユーザーとの間の位置の共同出現箇所を追跡したい - つまり、どのように多くの各ユーザーのペアが同じ場所にいた回数。私が考えているフォーマットはmutable.HashMap[(String, String), Int]

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

ユーザ位置マップの更新は、私は、ユーザーが一緒である再検討し、共同出現箇所の彼らのランニングカウントに1を追加するたびに。

以下のコードは、{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を使用しています。

答えて

3

のように、keysのすべての組み合わせを取得し、新しいマップを生成するのに等しいかどうかを比較することsubsets(2)を使用します。

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)