2017-01-24 14 views
1

内側のリストを有することができる要素のパターンマッチング:今反復処理または私は以下の構造を有するスカラ

case class Something(name: String, more: List[Something]) 

は、私は、この「ツリー」内のすべての可能な要素の上に行きたいことを、想像することができます

どうすればよいですか?私は、この構造の上に副作用を実行したい:

Something("some", List(Something("someMore", Nil), Something("momoMore", Nil), Something("nowIwantToSee", List(...... a lot more something )) )) 

そしてこれは、より多くの入れ子構造に行くことができます....

???

答えて

1

使用再帰:だから

def recurse(something: Something): Unit = { 
    println(something.name) 
    something.more.foreach(recurse) 
} 

> val something = Something("some", List(Something("someMore", Nil), Something("momoMore", Nil), Something("nowIwantToSee", Nil))) 
> recurse(something) 
some 
someMore 
momoMore 
nowIwantToSee 
1

@Jean Logeartが機能するソリューションを提供してきました。私が見る問題は、その機能がtail recursiveではないということだけです。 @tailrec注釈でそれをテストできます。

あなたは次のように、ここでpattern matchingを使用することができます。

def traverse(something: Something): Unit = { 
    println(something.name) 
    something match { 
     case Something(name, Nil) => 
     case Something(name, x :: Nil) => traverse(x) 
     case Something(name, x :: xs) => traverse(Something(x.name, xs)) 
    } 
    } 
+0

勘弁を。これらの 'println()'はすべて、一致する前に一番上の単一の 'println(something.name)'で置き換えることができます。 – jwvh

+0

ああ、私は悪い、私はそれを逃した。指摘してくれてありがとう。私は編集をしました。 – oblivion

+0

Ah。余分な空白を取り除き、インデントを修正してください。それは素晴らしいクリーンコードになります。 – jwvh

関連する問題