我如何迁移我的getPrime()方法所以它只返回我的素数而不是()

时间:2018-04-04 06:16:53

标签: scala

问题:我只想致电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>

4 个答案:

答案 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

这就是让我了解溪流有用的例子!