###実現したいこと
以下に書いてあるコードをもう少し綺麗に書く良い方法はないでしょか?
###問題のコード
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/24 01:49
回答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さんがかなり詳しく回答されていらっしゃいますので、
私はおまけ的に回答を載せておきます。
hoge2
はTraversable#foreach
を使ったバージョン、
hoge3
はfor
をまとめて書いたバージョンです。
いずれも戻り値は無し(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総合スコア9390
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/05/25 14:33
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
総合スコア37
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/05/25 14:33
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。