2017-09-05 4 views
1

は、例えば、Scalaの地図があるとしましょうと:Scalaのマップと他のマップにマップをGROUPBY、小さなキーセット

val map:Map[String, List[String]= Map("Apple" -> List("Red", "Tasty"), "Orange" -> List("Sour", "Orange"), "Banana" -> List("Yellow"), "Mango" -> List("Best", "Yellow", "Favorite")) 

今、私は唯一のマップを使用して、次のマップ、それを変換したいです._1.sizeをキーとして使用し、同じキーで値をグループ化します。

Map(5 -> List("Best", "Yellow", "Favorite", "Red", "Tasty"), 6 -> List("Sour", "Orange", "Yellow")) 

どうすればいいですか?

答えて

4
map.groupBy(_._1.length).map { case (length, m) => 
    length -> m.values.flatten 
} 

最初に長さ別にグループ化すると、Map[Int, Map[String, List[String]]]が表示されます。
これらのマップ値を平坦化して最終結果を得る必要があります。あなたは鍵(length)を保持します。

2

あなたが言ったようにグループ分けして、結果として得られるコレクションをさらに処理してください。

F.ex:

map.groupBy(_._1.size).mapValues(_.values).mapValues(_.flatten)

編集:Insan-E:Sそれは常に存在Scalaのパターンマッチングは、それがもう少し作る場合でも、コレクションを一回の反復を回避するので答えは優れています詳細。

0
val result = map.map {case (string,list) => list.map(x => (string.length,x)) }.flatten.groupBy(_._1).map{ case (int,list) => (int,list.map(_._2)) } 
1

別の可能な解決策は次のようになります。

scala> map.groupBy(_._1.size).map(x => (x._1,x._2.values.flatten)) 
res89: scala.collection.immutable.Map[Int,Iterable[String]] = Map(5 -> List(Red, Tasty, Best, Yellow, Favorite), 6 -> List(Sour, Orange, Yellow)) 
関連する問題