如何在Scala中将元素追加到列表

时间:2019-05-22 12:31:56

标签: scala

我有一个列表:

val k = List(1,2,3,4,-69,78)

,并希望删除列表中的所有否定元素

我有以下代码:

val k = List(1,2,3,4,-69,78)
val a = List()


for( k <- k){
         if(k > 0){
           a=a:+k
         }
      }

      println(a)

应该在列表中运行的内容,如果列表中的元素为正,则应将其附加到另一个列表in this case list a

但是我遇到以下错误:

ScalaFiddle.scala:9:错误:重新分配给val              a = a:+ k               ^

我该如何解决

请注意,我有意不想使用l.filter。

如果有人对我的操作方法有更好的想法,将不胜感激

预先感谢

4 个答案:

答案 0 :(得分:3)

您正在以Java方式进行操作。 在Scala中,应避免使用可变变量,并尽可能使用不可变变量。

针对您的问题的更好的“ Scala”解决方案是执行以下操作:

val k = List(1,2,3,4,-69,78)
val a = k.filter(_ > 0)

如果您仍想追加到列表中,则需要将a更改为:

val a = new mutable.MutableList[Int]()

并这样追加:

a += k

答案 1 :(得分:0)

您正在尝试将值重新分配给常量(即val),而该常量是不可能的,List a应该改为var

val k = List(1,2,3,4,-69,78)
var a = List[Int]()


for(k <- k){
   if(k > 0){
       a = a :+ k
   }
}

println(a)
// Display List(1, 2, 3, 4, 78)

答案 2 :(得分:0)

您应该使用 val 而不是 var 。 简而言之:var可以在初始化后修改,而val则不能。

但是重要的是要注意,Scala由于不可变性而阻止使用 var

val k = List(1,2,3,4,-69,78)
var a: List[Int] = List()

for( k <- k){
  if(k > 0){
    a=a:+k
  }
}

println(a)

答案 3 :(得分:0)

无法重新分配Scala中的

val。 编写val a = List()时,您会得到a,其中包含空列表。

当您编写a :+ k时,会得到 new 列表,并且您必须将其分配给另一个值以便将来访问它,问题是您无法重新分配{{1} },因为它是a

您可以使用val,但这种方式被认为是不好的做法。

另一种解决方案是使用函数:

var

现在您可以写:

def onlyPositives(k: List[Int], a: List[Int] = List.empty[Int]): List[Int] = k match {

    // case when there is no elements left in k
    case Nil => a

    // we get first element of k and
    // if it is positive, append it to a
    case x::tail => onlyPositives(tail, if (x > 0) a:+x else a)
}

P。 S. 我想知道为什么您不使用val k = List(1, 2, 3, 4, -69, 78) val a = onlyPositives(k) // List(1, 2, 3, 4, 78)