我无法在Scala中使用循环追加列表

au9on6nz  于 2022-11-09  发布在  Scala
关注(0)|答案(2)|浏览(266)
object LoopList extends App {
  var even_list = List()
  var odd_list = List()

  for (i <- Range(1,10)) {
    if ((i % 2) == 0) {
      even_list = even_list :+ i
    } else {
      odd_list = odd_list :+ i
    }
  }

  println(even_list)
}

我试图为奇数和偶数创建两个简单的列表,虽然我知道列表是不变的,但我也尝试了元组。请建议一种新的解决方案,只使用for循环。

bvpmtnay

bvpmtnay1#

据我所知,问题是在声明它们时,编译器没有足够的信息来确定列表中项的类型。因此,它确定列表是List[Nothing],并且编译器告诉您正在尝试添加Int,但它需要Nothing
要解决此问题,您可以添加一个简单的类型注解,如下例所示:

var even_list: List[Int] = List()
var odd_list: List[Int] = List()

for (i <- Range(1, 10)) {
  if ((i % 2) == 0) {
    even_list = even_list :+ i
  } else {
    odd_list = odd_list :+ i
  }
}

println(even_list)

您可以使用这个代码here on Scastie
正如一条评论所建议的,我们绝对鼓励您尝试使用Scala标准库的Collection API,它为您提供了非常强大的构造来以紧凑和可读的方式创建程序,如上面提供的用一行代码构造列表的示例所示:

val (evens, odds) = List.range(1, 10).partition(i => (i % 2) == 0)
tv6aics1

tv6aics12#

顺便说一句,追加元素是一个非常慢的List操作。如果可能,最好使用逆序构造List

var even_list: List[Int] = Nil
    var odd_list: List[Int] = Nil

    for (i <- 9 to 1 by -1) {
      if ((i % 2) == 0) {
        even_list = i :: even_list
      } else {
        odd_list = i :: odd_list
      }
    }

    println(even_list)
    println(odd_list)

或者使用下面转换为List的另一个合适的集合。

相关问题