我正在尝试添加和反对列表而不仅仅是一个数字,所以当你回复一个例子,如果你可以使用像我的二手车例子或水果之类的东西 我一直在寻找每个地方,我看到的所有例子都只是在列表中添加数字 我试图将一些Java代码转换为scala 转换有问题的java代码是
ArrayList usedCarList = new ArrayList();
UsedCars usedCar = new UsedCars();
usedCarList.add(usedCar);
现在我看了几个例子,但是一旦我开始尝试使用对象,它们似乎不起作用,即
var b = List[Int]();
b ::= 1;
b ::= 2;
b ::= 3;
我已经尝试了下面列出的一些事项。
var usedCarList = List();
def addCar (usedCarList: List[UsedCars]){
var usedCar = new UsedCars();
series of set operations on the usedCar
usedCar :: usedCarList;
println(usedCarList.length);
}
当我检查列表的大小时,它总是空的
答案 0 :(得分:5)
有可变的(例如scala.collection.mutable.MutableList
)和不可变的列表(scala.collection.immutable.List
)。您使用的是不可变列表,因此只需在元素上调用::
实际上返回带有添加元素的新实例,但不会更改基础值。您必须使用带有不可变列表的var
,或使用这样的可变列表:
scala> import scala.collection._
import scala.collection._
scala> val list = mutable.MutableList[UsedCars]()
list: scala.collection.mutable.MutableList[UsedCars] = MutableList()
scala> list += new UsedCars()
res0: list.type = MutableList(UsedCars@4bfa79c8)
scala> list.size
res1: Int = 1
请参阅su的答案,用不可变列表重新分配引用。
答案 1 :(得分:5)
Scala的List
和Java的ArrayList
之间存在根本区别:Scala的List
是不可变的。
不仅仅是只读 - Java中的只读集合仍然可以由创建它的人改变。在Scala中,任何人都无法更改List
。
现在,让我们通过您展示“有效”的示例来协调:b ::= 1
。该示例等同于b = 1 :: b
,因此不会更改列表。相反,它正在创建新列表,并将其分配给b
。这可能听起来效率低下,但它实际上非常快,因为List
是一个持久的数据结构(查看更多信息)。
因此,对您的问题最明显的答案是使用不同类型的数据结构。 Scala最接近ArrayList
的是ArrayBuffer
。
但是,还有另一种可能性。而不是更改列表并且不返回任何内容,返回新列表。这可能需要对代码结构进行其他更改,因为没有关于它的细节,我不会推测它们可能是什么。