質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.93%

scalaのタプルのシーケンスからタプルの要素を取り出したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 271

yochun02

score 32

scalaで以下の処理をするにはどうしたらよいかわかりません。

val x: Seq[(Int, Seq[String])] = [
(1, ["hoge1", "fuga1", "piyo1"]),
(2, ["hoge2", "fuga2", "piyo2"]),
(3, ["hoge3", "fuga3"])
]
val y: Seq[Int] // > y = [1, 2, 3] となるようにしたい
val y: Seq[String] // > y = ["1 - hoge1",
                             "1 - fuga1", 
                             "1 - piyo1",
                             "2 - hoge2", 
                             "2 - fuga2", 
                             "2 - piyo2", 
                             "3 - hoge3", 
                             "3 - fuga3" 
]
// タプルの2番目の要素数の合計数を持つリストを生成したい(今の場合、3 + 3 + 2 = 8 個の要素数を持つ)


べた書きにすると

scala> val y: Seq[String]  = List(s"${x(0)._1} - ${x(0)._2(0)}",
                                  s"${x(0)._1} - ${x(0)._2(1)}",
                                  s"${x(0)._1} - ${x(0)._2(2)}",
                                  s"${x(1)._1} - ${x(1)._2(0)}",
                                  s"${x(1)._1} - ${x(1)._2(1)}",
                                  s"${x(1)._1} - ${x(1)._2(2)}",
                                  s"${x(2)._1} - ${x(2)._2(0)}",
                                  s"${x(2)._1} - ${x(2)._2(1)}")


実行結果

y: Seq[String] = List(1 - hoge1, 1 - fuga1, 1 - piyo1, 2 - hoge2, 2 - fuga2, 2 - piyo2, 3 - hoge3, 3 - fuga3)


なのですが、mapやリスト操作に慣れていないので効率よい書き方がわかりません

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

実行結果にある結果が欲しいならこうですかね

x.flatMap{
  case (idx, list) => list.map(item => s"$idx - $item")
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

これはScalaのコードじゃないのでは? と思いましたが……

val x: Seq[(Int, Seq[String])] = Seq(
(1, Seq("hoge1", "fuga1", "piyo1")),
(2, Seq("hoge2", "fuga2", "piyo2")),
(3, Seq("hoge3", "fuga3"))
)
val y: Seq[Int] = x.map(_._1)

実行結果

scala> val x: Seq[(Int, Seq[String])] = Seq(
     | (1, Seq("hoge1", "fuga1", "piyo1")),
     | (2, Seq("hoge2", "fuga2", "piyo2")),
     | (3, Seq("hoge3", "fuga3"))
     | )
x: Seq[(Int, Seq[String])] = List((1,List(hoge1, fuga1, piyo1)), (2,List(hoge2, fuga2, piyo2)), (3,List(hoge3, fuga3)))

scala> val y: Seq[Int] = x.map(_._1)
y: Seq[Int] = List(1, 2, 3)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/04 09:51 編集

    質問が下手くそで申し訳ないです。
    型をSeq[(any,Seq[any])]→ Seq[any]
    に変換したいのです。(その際に、元々あったタプルの情報をまとめていることが必要です。
    質問を編集しましたので御手数ですがご確認出来ますでしょうか?

    キャンセル

  • 2019/10/04 11:10

    何で詰まっているのかわからないのでダメだったコードの例を書きましょう

    キャンセル

  • 2019/10/04 11:50 編集

    mapやforでのリスト操作が根本的な不明点です。現時点での自分のコードを追記しました。

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る