2017-01-12 6 views
1

Предположим, у меня есть Map какScala Map: сочетать ключи с одинаковым значением?

val x = Map(1 -> List("a", "b"), 2 -> List("a"), 
      3 -> List("a", "b"), 4 -> List("a"), 
      5 -> List("c")) 

Как бы создать из этого новый Map где ключи List s ключей от x, имеющие одинаковое значение, например, как можно реализовать

def someFunction(m: Map[Int, List[String]]): Map[List[Int], List[String]] = 
    // stuff that would turn x into 
    // Map(List(1, 3) -> List("a", "b"), List(2, 4) -> List("a"), List(5) -> List("c")) 

?

ответ

3

Вы можете преобразовать карту в список, а затем использовать groupBy агрегировать первый элемент каждого кортежа:

x.toList.groupBy(_._2).mapValues(_.map(_._1)).map{ case (x, y) => (y, x) } 

// res37: scala.collection.immutable.Map[List[Int],List[String]] = 
//  Map(List(2, 4) -> List(a), List(1, 3) -> List(a, b), List(5) -> List(c)) 

Или, как @Dylan комментировал, используйте _.swap для переключения элементов кортежей:

x.toList.groupBy(_._2).mapValues(_.map(_._1)).map(_.swap) 
+3

Вы избили меня на несколько секунд с помощью практически такого же решения, поэтому я дам вам +1 и добавлю, что вы можете использовать '_.swap' в последнем вызове' map'. – Dylan

+0

@ Dylan Ah, ранее не знал метод '_.swap'. Спасибо! – Psidom

+0

Замечательно, спасибо огромное! – user4601931