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; 

我已经尝试了一些事情 1 下面列出了。

var usedCarList = List();
def addCar (usedCarList: List[UsedCars]){
var usedCar = new UsedCars();
series of set operations on the usedCar
usedCar :: usedCarList;
println(usedCarList.length);
}

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

4

2 回答 2

8

有可变的(例如scala.collection.mutable.MutableList)和不可变的列表(scala.collection.immutable.List)。您使用的是不可变列表,因此仅调用::一个元素实际上会返回一个带有添加元素的新实例,但不会更改基础值。您必须将 avar与不可变列表一起使用,或者使用这样的可变列表:

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- 的答案。

于 2013-04-01T20:12:03.567 回答
6

ListScala和 Java之间有一个根本区别ArrayList:ScalaList是不可变的。

不仅仅是只读的——Java 中的只读集合仍然可能被创建它的人更改。在 Scala 中, aList不能被任何人更改。

现在,让我们将其与您展示的“有效”示例相协调:b ::= 1。该示例等效于b = 1 :: b,因此它不会更改列表。相反,它正在创建一个列表,并将其分配给b. 这听起来可能效率低下,但实际上速度非常快,因为它List是一个持久数据结构(查找更多信息)。

因此,对您的问题最明显的答案是使用不同类型的数据结构。Scala 最接近的等价物ArrayListArrayBuffer.

但是,还有另一种可能。与其更改列表并且不返回任何内容,不如返回一个新列表。这很可能需要对代码结构进行其他更改,并且由于没有关于它的详细信息,我不会推测它们可能是什么。

于 2013-04-02T02:58:56.560 回答