2017-02-10 4 views
0

Je veux définir la fonction dans Scala avec récursion qui retourne un ensemble de lettres qui est présent dans tous les mots de la liste.Scala, partie commune (intersection) des mots de la liste en utilisant les ensembles

Par exemple:

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

doit retourner quelque chose comme:

Set('a') 

[MISE À JOUR] Mon code se présente comme suit:

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)) 
     } 
    } 

Pendant que je veux montrer ce que la fonction retourne en imprimant l'exécution de celui-ci

println(inAll(l)) 

puis j'obtiens le RuntimeException. J'ai cherché des heures sur le Net pour résoudre ce problème, mais je n'ai pas trouvé la réponse. J'ai trouvé quelque chose comme ça, mais ce n'est pas suffisant.

L'erreur que je reçois est:

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 

Je pense qu'il ya quelque chose de mal dans la ligne dans laquelle je veux recouper récursive tous les mots d'un liste en appelant la fonction inALL avec le paramètre n2. Cette exception est lorsque j'essaye d'exécuter mon programme, il n'y a pas d'erreur quand je le compile.

[MISE À JOUR] Je compilez programme à l'aide

compile 

dans SBT. Et l'exécuter par

run 

également dans SBT.

+0

C'est un l (L en minuscule). – mmazepa

+1

Pouvez-vous partager le code entier s'il vous plaît, ainsi que la façon dont vous le compilez? Est-ce une erreur de compilation ou une erreur d'exécution? La plus grande partie de la stacktrace est à propos de SBT ... – Dici

+0

C'est une erreur d'exécution. J'ai mis à jour ma question. – mmazepa

Répondre

1

Votre fonction inAll utilise l à match au lieu de l'argument lista de la fonction.

Ceci apparaît provoquerait un dépassement de pile ou une exception de mémoire insuffisante et provoquerait le blocage du programme.

+0

Merci, cela fonctionne très bien pour moi! – mmazepa

+0

@mmazepa vous ne nous avez probablement pas montré la bonne partie de l'exception. L'exception que vous avez soumise n'a absolument aucun rapport avec ce qui se passait réellement. Ne dites pas cela pour être méchant, juste pour vous dire que vous devez apprendre à identifier ce qui est important dans une pile de pile et ce qui ne l'est pas. Dans cet exemple, le stracktrace n'a pas vraiment aidé car il ne s'agissait que de SBT, pas de votre code – Dici