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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Scala

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

Q&A

解決済

2回答

3552閲覧

Scalaの多次元リスト

退会済みユーザー

退会済みユーザー

総合スコア0

Scala

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

0グッド

1クリップ

投稿2016/05/23 15:00

編集2016/05/25 14:23

###実現したいこと
以下に書いてあるコードをもう少し綺麗に書く良い方法はないでしょか?

###問題のコード

def hoge(list: list[List[String]]): List[List[List[List[String]]]] = { val a = for(i <- list) yield { val b = for(j <- i) yield { //処理 } b } a }

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

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

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

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

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

argius

2016/05/23 23:44

これはfor-yieldの戻り値として空の多次元リストが得られますが、それも意味があるということでよろしいでしょうか? それとも単純に二重ループするだけで良いのでしょうか?
Kuchitama

2016/05/24 01:49

hoge関数の戻り値型を書いていただけると、どのような結果が欲しいのか判断しやすくなると思います
guest

回答2

0

あ、ベストアンサーになってしまいましたね...

編集していただきありがとうございます。ですが、これって綺麗に書く以前に現状で動作しませんよね? コンパイルも通りませんし。実際に動かしたものを書いていただければ話が早いと思いますよ。

ご期待の処理かどうかは分かりませんが、とりあえず動くものを書いてみました。

lang

1 2 def hoge4(list: List[List[String]]): List[List[List[List[String]]]] = { 3 list.map { x => x.map { y => List(List(y)) } } 4 } 5 6 val a = List(List("ABC", "DEF"), List("GHI")) 7 println("--- hoge4 ---") 8 println(hoge4(a))

結果

--- hoge4 --- List(List(List(List(ABC)), List(List(DEF))), List(List(List(GHI))))

simple-teqさんがかなり詳しく回答されていらっしゃいますので、
私はおまけ的に回答を載せておきます。

hoge2Traversable#foreachを使ったバージョン、
hoge3forをまとめて書いたバージョンです。

いずれも戻り値は無し(Unit)です。

結果は異なりますが、お望みの方をお選び下さい。
戻り値が必要な場合は、simple-teqさんの回答をご覧ください。

lang

1def hoge2(list: List[List[String]]): Unit = { 2list.foreach { i => 3 println(s"i: $i") 4 i.foreach { j => 5 println(s"j: $j") 6 } 7} 8} 9 10def hoge3(list: List[List[String]]): Unit = { 11for { 12 i <- list 13 j <- i 14} { 15 println(s"i: $i") 16 println(s"j: $j") 17} 18} 19 20val a = List(List("ABC", "DEF"), List("GHI")) 21println("--- hoge2 ---") 22hoge2(a) 23println("--- hoge3 ---") 24hoge3(a)
  • 結果
--- hoge2 --- i: List(ABC, DEF) j: ABC j: DEF i: List(GHI) j: GHI --- hoge3 --- i: List(ABC, DEF) j: ABC i: List(ABC, DEF) j: DEF i: List(GHI) j: GHI

投稿2016/05/25 12:03

編集2016/05/25 14:42
argius

総合スコア9390

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

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

退会済みユーザー

退会済みユーザー

2016/05/25 14:33

ありがとうございます
guest

0

ベストアンサー

試しに考えてみました。
hoge の引数は変更しております。

Scala

1 def hoge(list: List[List[String]]) = { 2 val a = for(i <- list) yield { 3 val b = for(j <- i) yield { 4 //処理 5 j.toLowerCase() 6 } 7 b 8 } 9 a 10 }

『引数のListの文字列を小文字に変換』を処理に記載しました。

実行すると下記の結果になります。

Scala

1val hogeVal = hoge(List(List("A1","A2","A3"),List("B1","B2","B3") )) 2println(hogeVal) 3// List(List(a1, a2, a3), List(b1, b2, b3))

恐らく思った回答では無いのですが、こんな感じでfor文は入れ子に出来ます。

Scala

1 def hoge_V2(list: List[List[String]]) = { 2 for( 3 i <- list; 4 j <- i 5 ) yield { 6 j.toLowerCase() 7 } 8 }

この結果は、こんな感じです。
1次元のListになってしまいます(これはNG!?)。

Scala

1val hogeVal_V2 = hoge_V2(List(List("A1","A2","A3"),List("B1","B2","B3") )) 2println(hogeVal_V2) 3// List(a1, a2, a3, b1, b2, b3)

こんな感じで map 関数でも実行できます。

Scala

1def hoge_V3(list: List[List[String]]) = list map (i => i map(j => j.toLowerCase))

Scala

1val hogeVal_V3 = hoge_V3(List(List("A1","A2","A3"),List("B1","B2","B3") )) 2println(hogeVal_V3) 3// List(List(a1, a2, a3), List(b1, b2, b3))

for , map , flatMap とかの関係が以下のGithubで紹介されています。
https://github.com/hatena/Hatena-Textbook/blob/master/foundation-of-programming-scala.md

読んでなんとなく、map、flatMapの動きはわかるのですが、私自身は身についている感じがまだしておりません。
これぐらいの簡単な例だとmapが一番短いですが、関数名とかも実用的な名称をつけたり、入れ子が深くなりすぎるとfor文(;でつなぐやり方)が見やすいのかもしれません。

投稿2016/05/24 14:30

simple-teq

総合スコア37

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

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

退会済みユーザー

退会済みユーザー

2016/05/25 14:33

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問