2016-08-09 4 views
0

Я хочу преобразовать карту пользователей своим друзьям на карту друзей своим друзьям. type Имя пользователя: String Так что карта [Имя пользователя, список [Пользователь]] на карте [Имя пользователя, список [Имя пользователя]], сделав каждый Список [Пользователь] в ключе.Рефакторинг стиля java для более функционального стиля scala

У меня есть следующий код ниже, который очень похож на java, что я хочу реорганизовать, чтобы сделать его более идоматическим scala-кодом.

val map: Map[String, List[User]] = { 
    var m = collection.mutable.Map[String, collection.mutable.ListBuffer[User]]() 
    for(user <- users) { 
    for(friend <- user.Friends) { 
     if (m.contains(friend)) { 
     //m.get(friend.username) += user 
     } else { 
     m += (friend -> collection.mutable.ListBuffer[User]()) 
     //m.get(friend.username) += user 
     } 
    } 
    } 
    m.map{e => 
    (e._1 -> e._2.toList)}.toMap 
} 

Я начал пытаться это:

users.map(user => 
    user.friends.flatMap(friend => 

) 

В качестве примечания, как я прилагаю к ListBuffer, по какой-то причине это не работает для меня:

m.get(friend.username) += user 

А к новичкам будет добавлен listbuffer и append?

+0

В словах, что вы пытаетесь достичь? – Alec

+0

Я хочу преобразовать код, используя более функциональный стиль. –

+1

Попробуйте что-нибудь вроде «У меня есть имена как String, каждый из которых указывает на список [String] соответствующих друзей с картой, и я пытаюсь вычислить « – Esardes

ответ

2

Может быть, вы хотели бы

val map: Map[String, List[User]] = { 
     val m = new collection.mutable.HashMap[String, collection.mutable.Set[User]]() with scala.collection.mutable.MultiMap[String, User] 
     for { 
      user <- users 
      friend <- user.Friends 
     } m.addBinding(friend.username,user) 

     m.mapValues(x ⇒ x.toList).toMap 
    } 

И второй вопрос: метод m.get (friend.username) возвращает Option [ListBuffer [User]]. Опция не содержит + =.

Update

Одна линия решение

val map: Map[String, Seq[User]] = { 
     users.flatMap(user ⇒ user.Friends.map(_ → user)).groupBy(_._1.username).mapValues(_.map(_._2)) 
    } 
+0

Это работает для вас? Как groupBy (_._ 1.username) конвертируется в карту уже? –

+0

метод groupBy группирует элементы в 'Map [String, Seq [T]]' где T - «Друг -> Пользователь». Здесь ключ - это значение, указанное в параметре, а значения - это последовательность элементов из исходных данных. – KosWarm

+0

Параметр '_._ 1' получает' Friend' от 'Friend -> User'. '_._ 1.username' принимает значение от' Friend' для группировки – KosWarm

Смежные вопросы