2016-08-23 11 views
1

の一部このコードとして、いくつかのデータを削除します。GROUPBY

import scala.collection.immutable.Set; 

object Update extends App { 

    val ss: List[Set[(String, String)]] = List(Set(
    ("sentance1", "url1"), 
    ("sentance2", "url1"), 
    ("sentance3", "url2") 
)); 

    val linesWithUrl: List[Map[String, Set[(String, String)]]] = ss.map(m => m.groupBy(_._2)) 

    linesWithUrl.foreach(println) 
} 

リターン:

Map(url1 -> Set((sentance1,url1), (sentance2,url1)), url2 -> Set((sentance3,url2))) 

私はマップ内の値と同じくらいの文章を返すようにしたい:

Map(url1 -> Set((sentance1), (sentance2)), url2 -> Set((sentance3))) 

方法を私はlinesWithUrlを繰り返し処理し、必要な値だけでマップを作成することを検討していますが、期待されるデータ構造を別の方法ですか?

答えて

1

何も考えられない。私はあなたが提案したものを信じて - その後それ以上のマッピング - それを行うための正しい方法である:

ss.map(m => m.groupBy(_._2).mapValues(_.map(_._1))) 

私はルールのいくつかの種類としてこれを言っていないんだけど、個人的に、私は通常、最も簡単であるソリューションのために努力しますパフォーマンスの問題がなければ明らかです。それ以外の方法をとることは、後であなたのコードを理解しようとしている人にとって、おそらくそれを困難にするでしょう。

EDIT:スタイル関連の注意点として、私はあなたがm => m.groupByを使用したことを今気づきました。それが好きなら、もs => s.map(一貫性は素晴らしいことです:))に変更してください。それはおそらくタプルのために不要です。