2017-02-10 3 views
0

Я хочу определить функцию в Scala с рекурсией, которая возвращает множество букв, которые присутствуют во всех словах из списка.Scala, общая часть (пересечение) слов в списке с использованием наборов

Например:

val l = List("rak","krab","krab","bark","mucha","mucha","trakty") 

должен возвращать что-то вроде:

Set('a') 

[ОБНОВЛЕНО] Мой код выглядит следующим образом:

object Program { 
     def main(args: Array[String]): Unit = { 

      val l = List("rak","krab","krab","bark","mucha","mucha","trakty") 

      def inAll(lista: List[String]): Set[Char] = l match { 
       case Nil => Set() 
       case n :: Nil => n.toSet 
       case n :: n2 => n.toSet & inAll(n2) 
      } 

      println(inAll(l)) 
     } 
    } 

В то время как я хочу показать, что функция возвращает путем печати его исполнения

println(inAll(l)) 

затем я получаю RuntimeException. Я много часов искал в Сети, как это решить, но я не нашел ответа. Я нашел что-то вроде этого, но этого недостаточно.

Ошибки я получаю:

java.lang.RuntimeException: Nonzero exit code: 1 
     at scala.sys.package$.error(package.scala:27) 
     at sbt.BuildCommon$$anonfun$toError$1.apply(Defaults.scala:2128) 
     at sbt.BuildCommon$$anonfun$toError$1.apply(Defaults.scala:2128) 
     at scala.Option.foreach(Option.scala:236) 
     at sbt.BuildCommon$class.toError(Defaults.scala:2128) 
     at sbt.Defaults$.toError(Defaults.scala:39) 
     at sbt.Defaults$$anonfun$runTask$1$$anonfun$apply$46$$anonfun$apply$47.apply(Defaults.scala:769) 
     at sbt.Defaults$$anonfun$runTask$1$$anonfun$apply$46$$anonfun$apply$47.apply(Defaults.scala:767) 
     at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47) 
     at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40) 
     at sbt.std.Transform$$anon$4.work(System.scala:63) 
     at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228) 
     at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228) 
     at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17) 
     at sbt.Execute.work(Execute.scala:237) 
     at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228) 
     at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228) 
     at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159) 
     at sbt.CompletionService$$anon$2.call(CompletionService.scala:28) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
    [error] (compile:run) Nonzero exit code: 1 

Я думаю, что есть что-то неправильно в строке, в которой я хочу, чтобы рекурсивно пересекаться все слова из список, вызвав функцию inAll с параметром n2.

case n :: n2 => n.toSet & inAll(n2) 

Это исключение, когда я пытаюсь запустить свою программу, при компиляции ошибок нет.

[ОБНОВЛЕНО] компилировать программу с использованием

compile 

в SBT. И запустите его на

run 

также в SBT.

+0

Это l (L в нижнем регистре). – mmazepa

+1

Можете ли вы поделиться всем кодом, пожалуйста, так же, как вы его скомпилируете? Это ошибка времени компиляции или ошибка времени выполнения? Большая часть stacktrace о SBT ... – Dici

+0

Это ошибка времени выполнения. Я обновил свой вопрос. – mmazepa

ответ

1

Функция inAll использует l до match вместо аргумента функции lista.

Это может привести к переполнению стека или исключению из памяти и сбою программы.

+0

Спасибо, это отлично работает для меня! – mmazepa

+0

@mmazepa, вы, вероятно, не указали нам правильную часть исключения. Исключенное вами сообщение совершенно не имеет отношения к тому, что на самом деле происходит. Не говоря это, чтобы быть средним, просто чтобы сказать вам, вам нужно научиться определять, что важно в stacktrace, а что нет. В этом примере stracktrace действительно не помог, потому что речь шла только о SBT, а не о вашем коде – Dici

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