问题:我只想致电collect
并仅返回素数而我不想使用def main(args: Array[String]){
getPrime(100).collect{
case i:Int => println(i);
}
}
。
def getPrime(range : Int) = {
Range(2,range).map(x => if(isPrime(x)) x);
}
def isPrime(no : Int) = !Range(2,Math.sqrt(no).toInt + 1).exists(x => no%x ==0)
我想改变一些事情
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" bean-discovery-mode="annotated">
<scan>
<exclude name="org.apache.cxf.transport.http.Servlet3ContinuationProvider" />
<exclude name="org.springframework.http.server.ServletServerHttpAsyncRequestControl" />
<exclude name="org.springframework.web.context.request.async.StandardServletAsyncWebRequest" />
</scan>
</beans>
答案 0 :(得分:1)
与already been pointed out一样,您不想在没有if
的情况下使用else
,并且在您需要的时候不应该使用map()
是filter()
def getPrime(range: Int): Seq[Int] =
Range(2,range).filter(isPrime)
isPrime()
也可以更直接地表达。
def isPrime(n: Int): Boolean =
2 to Math.sqrt(n).toInt forall(n%_ > 0)
答案 1 :(得分:0)
基本上,你的getPrime方法返回AnyVal。你可以在那里使用collect只返回int的集合。
scala> def getPrime(range : Int) = {
| Range(2,range).map(x => if(isPrime(x)) x).collect{
| case e:Int => e
| }
| }
getPrime: (range: Int)scala.collection.immutable.IndexedSeq[Int]
scala> getPrime(100)
res8: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97)
答案 2 :(得分:0)
如果您不想使用collect
,则可以使用isInstanceOf
过滤掉Int
个值,
def getPrime(range: Int) = {
Range(2, range).map(x => if (isPrime(x)) x).filter(_.isInstanceOf[Int])
}
答案 3 :(得分:0)
生成素数的另一个好方法是使用流。
考虑以下
def naturals(n: Int): Stream[Int] = n #:: naturals(n + 1)
def primes(s: Stream[Int] = naturals(2)): Stream[Int] = s.head #:: primes(s.tail.filter(_ % s.head > 0))
就是这样。你有一个非常优雅的功能素数发生器。
如果您希望将第一个100
素数作为列表
primes().take(100).toList
或者如果您只对第100个素数感兴趣
primes().drop(99).head
这就是让我了解溪流有用的例子!