在Scala中向列表中添加对象

6

我想把一个对象添加到列表中,而不仅仅是数字。所以,如果您可以使用我的二手车示例或水果等对象来回复示例,那就太好了。


我已经到处寻找,看到的所有示例都只是将数字添加到列表中。
我正在尝试将一些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);
}

当我检查列表的大小时,它总是为空。

我不在意它插入列表的位置,因为它的位置对我来说并不重要。 - Jeremy
从评论中可以看出,上述代码并不是你正在“使用”的方式——相反,你声明了一个var并将其作为参数传递给其他东西来更改它,对吗?请编辑问题以说明你实际正在做什么。 - Daniel C. Sobral
抱歉,我编辑了主要问题以符合我的代码实际外观。是的,我在主方法中创建列表,并将其传递给此addCar函数,其中usedCars添加到列表中。同样,我有一个removeCar函数,可以从列表中删除汽车。 - Jeremy
2个回答

8

列表分为可变的(例如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-的回答,以重新分配不可变列表的引用。

当将列表传递给函数时,它是如何工作的?函数中的参数只是一个列表吗? - Jeremy
您可以在MutableList的实例上调用toList,将其转换为可传递的List实例。有关MutableList和替代方案的更多信息,请参见此处:https://dev59.com/Tm035IYBdhLWcg3wZvFg - Alex Yarmula
我想更好地澄清我的代码组织方式将有助于确定如何使其工作。我的主要方法是创建列表的地方,它被传递给addCar函数,其中汽车被添加到列表中。其他函数用于显示列表中的usedcars并从列表中删除汽车。使用可变或不可变列表哪个更容易?因此,如果我遵循可变示例,addCars函数会是什么样子? - Jeremy
如果您想要使用可变列表,我建议在列表周围创建一个包装类。它将保留对列表的引用,并具有您的方法,例如addCar、removeCar。 - Alex Yarmula

6
Scala的List和Java的ArrayList之间有一个根本性的区别:Scala的List是不可变的。这不仅仅是只读——在Java中,只读集合仍然可以被创建它的人更改。在Scala中,List不能被任何人更改。
现在,让我们来解释一下你展示的“有效”的例子: b :: = 1 。 这个例子等同于 b = 1 :: b ,所以它并没有改变列表。相反,它创建了一个新的列表,并将其分配给b。这听起来可能效率低下,但实际上非常快,因为List是一种持久化数据结构(查阅更多信息)。
因此,最明显的答案是使用不同类型的数据结构。Scala最接近ArrayList的等价物是ArrayBuffer
然而,还有另一种可能性可以追求。不要更改列表并返回空值,而是返回一个新的列表。这可能需要对代码结构进行其他更改,由于没有详细信息,我不会猜测它们可能是什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接