我有一个列表:
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。
如果有人对我的操作方法有更好的想法,将不胜感激
预先感谢
答案 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)
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)
?