2017-09-11 6 views
2

これは初めての投稿です。 以下に示すように、タプルをScalaのSetでMapに変換したいと考えています。タプルをスカラのセットでマップに変換する方法

Set((1,"a"),(2,"b"),(1,"c")) 

Map(1 -> Set("a","c"), 2 -> Set("b")) 

それを簡単にする方法はありますか?

不足している情報がある場合は、お知らせください。

答えて

3

Scalaコレクションライブラリのすべてのメソッドをチェックすることをお勧めします。これは非常に広範で、通常はこのような一般的なすべてのケースをカバーします。ここで

は、あなたがそれを行う方法です。

Set((1,"a"),(2,"b"),(1,"c")) 
    .groupBy(_._1).mapValues(_.map(_._2)) 

結果:

res0: Map[Int,Set[String]] = Map(2 -> Set(b), 1 -> Set(a, c)) 

UPD:@OlegPyzhcovが指摘したように、mapValuesは元のマップの怠惰なビューを作成し、値がされていますアクセスごとに再評価。作成後にmapが繰り返しアクセスされると、これは非効率的になる可能性があります。この問題を解決するには、最後にマップを実現したいと思うかもしれません。私はそれを行うための最も簡単な方法は、以下れると思う:

.mapValues(_.map(_._2)).map(identity) 

@OlegPyzhcov単純/より効率的な方法があるかどうか、私を修正してください。

+0

ありがとうございました! スカラコレクションライブラリを読み込もうとしています。 – mattsu

+1

'mapValues'は遅延ですので、アクセス、印刷などすべての要素に対して新しいセットを作成します。 –

+0

@OlegPyzhcovこれを指摘してくれてありがとうございます。 – Aivean

関連する問題