2017-01-24 10 views
1

I имеет следующую структуру:Итерация или Pattern Matching элемента, который может иметь внутренние списки в Scala

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()' s могут быть заменены одним 'println (something.name)' вверху, перед совпадением. – jwvh

+0

О, мой плохой, я пропустил это. Спасибо за указание. Я сделал редактирование. – oblivion

+0

Ах. Теперь просто избавьтесь от лишних пробелов, исправьте отступы, и это будет хороший чистый код. – jwvh

 Смежные вопросы

  • Нет связанных вопросов^_^