如何从Range创建List

时间:2009-09-11 01:32:16

标签: algorithm scala

我是Scala的新手,刚刚开始学习,所以这是一个基本的初学者问题。

我尝试实现Sieve of Eratosthenes算法。这是我到目前为止所得到的:

def sieve_core(cross: Int, lst: Seq[Int]): List[Int] = {
    val crossed = lst.filter(_ % cross != 0)
    crossed match {
            case a :: rest => cross :: sieve_core(a, crossed)
            case _ => cross :: Nil
    }
}

def sieve(max: Int): List[Int] = {
    sieve_core(2, (2 to max))
}

println(sieve(100))

结果是:

List(2)

据我了解,case _ => cross :: Nilsieve_core的第一次迭代中匹配,这意味着crossed不是List的实例。

我将lst参数类型更改为List[Int],现在代码将无法编译并显示错误:

(fragment of Problem3.scala):24: error: type mismatch;
 found   : Range.Inclusive
 required: List[Int]
    sieve_core(2, (2 to max))
                      ^

显然Range不是List

问题:如何将Range转换为List?或者我的代码是一个更大的问题,我在某个地方做了一些不好的假设?

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:31)

apply随播广告对象上有一个List方法,它占用一个范围并返回List

scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)

有许多有用的List工厂方法in the List collection documentation

答案 1 :(得分:7)

要将任何序列s转换为列表,请使用s.toList

我确信digitalross'在这种情况下更有效率。

答案 2 :(得分:0)

(2 to max)确实不是scala.collection.immutable.List,而是scala.collection.immutable.Range,更确切地说是scala.collection.immutable.Range.Inclusive的实例,如错误消息中所述。顺便说一句,InclusiveExclusive本身是Range的成员,具有相当明显的含义。

幸运的是,Range类提供了方便的方法toList,您可以利用该方法将范围转换为列表并解决问题,如以下代码片段所示:

scala> val max = 10
max: Int = 10

scala> val r = (2 to max)
r: scala.collection.immutable.Range.Inclusive = Range 2 to 10

scala> val l = r.toList
l: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)