首页 文章

如何从Range创建List

提问于
浏览
11

我是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?或者我的代码是一个更大的问题,我在某个地方做了一些不好的假设?

任何帮助赞赏 .

2 回答

  • 7

    List 伴侣对象上有一个 apply 方法,该方法占用一个范围并返回 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 .

  • 30

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

    不过,我确信digitalross'在这种情况下更有效率 .

相关问题