Scala,使用集合的列表中单词的公共部分(交集)
Scala, common part (intersection) of words in the list using sets
我想在 Scala 中使用递归定义函数,其中 returns 字母集出现在列表中的所有单词中。
例如:
val l = List("rak","krab","krab","bark","mucha","mucha","trakty")
应该return是这样的:
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))
}
}
虽然我想通过打印它的执行来显示什么功能 returns
println(inAll(l))
然后我得到 RuntimeException。我已经在网上搜索了几个小时如何解决这个问题,但我还没有找到答案。我找到了类似的东西,但这还不够。
- http://alvinalexander.com/scala/union-intersection-difference-scala-sets
- http://docs.scala-lang.org/overviews/collections/sets.html
我得到的错误是:
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)
at sbt.BuildCommon$$anonfun$toError.apply(Defaults.scala:2128)
at sbt.BuildCommon$$anonfun$toError.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$$anonfun$apply$$anonfun$apply.apply(Defaults.scala:769)
at sbt.Defaults$$anonfun$runTask$$anonfun$apply$$anonfun$apply.apply(Defaults.scala:767)
at scala.Function1$$anonfun$compose.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon.work(System.scala:63)
at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:228)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
at sbt.Execute.work(Execute.scala:237)
at sbt.Execute$$anonfun$submit.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit.apply(Execute.scala:228)
at sbt.ConcurrentRestrictions$$anon$$anonfun.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon.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[ 来递归地与列表中的所有单词相交的那一行有问题=50=].
case n :: n2 => n.toSet & inAll(n2)
这个异常是当我尝试运行我的程序时,编译时没有错误。
[更新] 我使用
编译程序
compile
在 SBT 中。 运行 它由
run
也在 SBT 中。
您的 inAll
函数使用 l
到 match
而不是函数的参数 lista
.
这会导致堆栈溢出或 out-of-memory 异常并使程序崩溃。
我想在 Scala 中使用递归定义函数,其中 returns 字母集出现在列表中的所有单词中。
例如:
val l = List("rak","krab","krab","bark","mucha","mucha","trakty")
应该return是这样的:
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))
}
}
虽然我想通过打印它的执行来显示什么功能 returns
println(inAll(l))
然后我得到 RuntimeException。我已经在网上搜索了几个小时如何解决这个问题,但我还没有找到答案。我找到了类似的东西,但这还不够。
- http://alvinalexander.com/scala/union-intersection-difference-scala-sets
- http://docs.scala-lang.org/overviews/collections/sets.html
我得到的错误是:
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)
at sbt.BuildCommon$$anonfun$toError.apply(Defaults.scala:2128)
at sbt.BuildCommon$$anonfun$toError.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$$anonfun$apply$$anonfun$apply.apply(Defaults.scala:769)
at sbt.Defaults$$anonfun$runTask$$anonfun$apply$$anonfun$apply.apply(Defaults.scala:767)
at scala.Function1$$anonfun$compose.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon.work(System.scala:63)
at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:228)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
at sbt.Execute.work(Execute.scala:237)
at sbt.Execute$$anonfun$submit.apply(Execute.scala:228)
at sbt.Execute$$anonfun$submit.apply(Execute.scala:228)
at sbt.ConcurrentRestrictions$$anon$$anonfun.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon.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[ 来递归地与列表中的所有单词相交的那一行有问题=50=].
case n :: n2 => n.toSet & inAll(n2)
这个异常是当我尝试运行我的程序时,编译时没有错误。
[更新] 我使用
编译程序 compile
在 SBT 中。 运行 它由
run
也在 SBT 中。
您的 inAll
函数使用 l
到 match
而不是函数的参数 lista
.
这会导致堆栈溢出或 out-of-memory 异常并使程序崩溃。