在Scala中构建列表

时间:2017-10-06 03:31:20

标签: scala list

为什么在Scala中构建列表如此困难?我知道很多其他语言,而且我从来没有遇到过如此困难的时间试图找出一个非常简单的用例...我花了一个多小时才完成了一个只需要1分钟就能实现的东西。我在这一点上有点不高兴,这就是我现在寻求帮助的原因

问题: 我试图做的是传入一个整数数组并返回一个奇数的立方体数组。

约束:我必须使用列表,我必须使用for循环

这是我到目前为止所做的:

    def cubes(a1: List[Int]): List[Int] = {
        var a2 = List[Int]()

        for(i <- 0 to a1.size-1){
            if(a1(i)%2 != 0) a2 :+ a1(i) * a1(i) * a1(i)
        }

        //If I try to print out the first element I get an error
        println(a2(0))
    }

    cubes(List(1, 2, 3, 4, 5, 6, 7))

这是错误

list1.scala:15: error: type mismatch;
 found   : Unit
 required: List[Int]
        println(a2(0))
               ^

问题:我如何重构代码,以便在给定约束的情况下构建List

2 个答案:

答案 0 :(得分:1)

您可以利用var关键字,而不是使用yield,而是可以使用def cubes(a: List[Int]): List[Int] = { val cubesList = for (item <- a if item % 2 != 0) yield { Math.pow(item, 3).toInt } cubesList //return the list created by the loop } 关键字从for-comprehension返回列表。

将结果分配给列表变量并返回它的示例:

scala> cubes(List(1,2,3,4,5)) foreach println
1
27
125

测试它:

def cubes(a: List[Int]): List[Int] = 
  for (item <- a if item % 2 != 0) 
  yield Math.pow(item, 3).toInt

通过直接返回for-comprehension的结果,可以缩短上面的代码。然后你也可以省略花括号:

{{1}}

答案 1 :(得分:0)

解决方案是使用ListBuffer并在返回之前将其转换为列表。列表是不可变的,因此我们必须使用列表缓冲区。

另外我得到的错误是因为返回类型是List[Int]但是我没有返回任何内容而我正在尝试打印我正在猜测返回某种类型的Unit

我仍然非常沮丧,花了很长时间才弄明白......好吧

以下是解决方案:

   import scala.collection.mutable.ListBuffer

    def cubes(a1: List[Int]): List[Int] = {
        var cubes = new ListBuffer[Int]()

        for (item <- a1 if item % 2 != 0) yield {
            cubes += Math.pow(item, 3).toInt
        }

        val cubesList = cubes.toList

        return cubesList
    }

    println(cubes(List(1, 2, 3, 4, 5, 6, 7)))
    println(cubes(List(3, 5, 6, 7, 11)))