🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Q&A

解決済

2回答

336閲覧

Scala tupleのあるシーケンス処理

yochun02

総合スコア76

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

0グッド

0クリップ

投稿2021/02/04 13:29

編集2021/02/04 14:21

以下のようにtupleを含むシーケンスを変換したいですがうまく変換できません。

scala

1val seq = Seq( 2 ("A", ("A", 1)), 3 ("A", ("A", 2)), 4 ("A", ("A", 3)), 5 ("B", ("B", 1)), 6 ("B", ("B", 2)), 7 ("C", ("C", 1)), 8 ) 9val seq1 = seq 10 .groupBy{ case (a,(b,c)) => 11 a 12 }.map{ case (k, v) => 13 Seq(k, v.map(_._2._2)) 14 } 15val seq2 = Seq( 16 ("A", Seq(1,2,3)), 17 ("B", Seq(1,2)), 18 ("C", Seq(1)) 19) 20println(seq1 === seq2) // false 21

イメージとしては、tupleの先頭の要素が同じものをSeqでまとめて新しいSeqとして返したいです。
seq1がList(List(String, List(Int)))になってしまってます。目指す形まであともう少しなのですが。。。どなたか助言ください。。
(seq2: List((String, List(Int)))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

groupBy 以外にも選択肢はあります。

scala

1val seq1 = seq.groupMap(_._1)(_._2._2).toSeq

でできるんじゃないでしょうか。

投稿2021/04/05 03:10

mather

総合スコア6759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Scala 知りませんが、こんな感じでしょうか。

scala

1val seq1 = seq 2 .groupBy{ case (a,(b,c)) => 3 a 4 }.map{ case (k, v) => 5 (k, v.map(_._2._2)) 6 }.toSeq

最終的に tuple のシーケンスにしたいなら、map に渡す関数は Seq ではなく tuple を返す必要があります。ここで、groupBy の結果は Map ですが、Map に対する map は、map に渡す関数が tuple を返す場合は map の結果は Map に、そうでなければ List になるようです。なので、最後に toSeq または toList すれば良いのでは。(toSeq してから map しても良いのかも。)

投稿2021/02/04 20:19

hoshi-takanori

総合スコア7899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問