Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Scala中将元素追加到列表的末尾_Arrays_Scala - Fatal编程技术网

Arrays 在Scala中将元素追加到列表的末尾

Arrays 在Scala中将元素追加到列表的末尾,arrays,scala,Arrays,Scala,我无法将类型为t的元素添加到列表list[t]中。 我尝试了myList::=myElement但它似乎创建了一个奇怪的对象并访问了myList。last始终返回列表中的第一个元素。我怎样才能解决这个问题呢?那是因为你不应该这样做(至少在不可变列表中)。 如果您真的需要在数据结构的末尾附加一个元素,并且该数据结构真的需要是一个列表,并且该列表真的必须是不可变的,那么请执行以下操作: (4 :: List(1,2,3).reverse).reverse 或者: List(1,2,3) ::: L

我无法将类型为
t
的元素添加到列表
list[t]
中。
我尝试了
myList::=myElement
但它似乎创建了一个奇怪的对象并访问了
myList。last
始终返回列表中的第一个元素。我怎样才能解决这个问题呢?

那是因为你不应该这样做(至少在不可变列表中)。 如果您真的需要在数据结构的末尾附加一个元素,并且该数据结构真的需要是一个列表,并且该列表真的必须是不可变的,那么请执行以下操作:

(4 :: List(1,2,3).reverse).reverse
或者:

List(1,2,3) ::: List(4)

请注意,此操作的复杂性为O(n)。如果您经常需要这个操作,或者对于长列表,请考虑使用另一个数据类型(例如ListBuffer)。Scala中的

列表未被设计为修改。事实上,您不能向Scala添加元素;它是一个不可变的数据结构,就像Java字符串一样。 当您在Scala中“向列表添加元素”时,实际要做的是从现有列表创建一个新列表

对于这样的用例,我建议不要使用列表,而是使用或。这些数据结构是为了添加新元素而设计的

最后,完成所有操作后,缓冲区可以转换为列表。请参见以下REPL示例:

scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer

scala> var fruits = new ListBuffer[String]()
fruits: scala.collection.mutable.ListBuffer[String] = ListBuffer()

scala> fruits += "Apple"
res0: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple)

scala> fruits += "Banana"
res1: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana)

scala> fruits += "Orange"
res2: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana, Orange)

scala> val fruitsList = fruits.toList
fruitsList: List[String] = List(Apple, Banana, Orange)

我们可以附加或前置两个列表或列表和数组
追加:

var l = List(1,2,3)    
l = l :+ 4 
Result : 1 2 3 4  
var ar = Array(4, 5, 6)    
for(x <- ar)    
{ l = l :+ x }  
  l.foreach(println)

Result:1 2 3 4 5 6
var l = List[Int]()  
   for(x <- ar)  
    { l= x :: l } //prepending    
     l.foreach(println)   

Result:6 5 4 1 2 3
var l=List(1,2,3)
l=l:+4
结果:1234
var ar=数组(4,5,6)

对于(x而言,这与其中一个答案相似,但方式不同:

scala> val x = List(1,2,3)
x: List[Int] = List(1, 2, 3)

scala> val y = x ::: 4 :: Nil
y: List[Int] = List(1, 2, 3, 4)

非常感谢!这正是我要搜索的。我想从你的答案来看,我不应该这样做……我会修改我的结构,看看我能做些什么。再次感谢。@Masiar如果你想要不变性和高效附加,请使用向量。请参阅“通过预加并反转来构建列表”中的“性能特征”部分如果您有许多元素要添加,则是一种有用的模式,但我认为像在现有列表中添加单个元素那样应用它不是一个好主意。“双反转”技巧会将列表重建两次,而
:+
,虽然效率可能很低,但只重建一次。没有O(2*n)我认为
List
被转换为
ListBuffer
,元素被追加,而
ListBuffer
被转换回来(很像Java中的
String
StringBuilder
),但这只是一个猜测。它是O(n)因为您必须完全遍历列表才能到达最后一个元素指针,并且能够附加使最后一个元素指针指向它的元素。@pisaruk如果是这样的话,您可以只保留一个指向头部和尾部的指针。但是,指针是不可变的,这意味着要“修改”列表的最后一个元素首先需要复制它。它的副本是O(n)-而不是列表本身的遍历。我相信它是O(n),因为它创建了一个全新的列表。cons操作符的复杂性是O(1),因为它处理“预期的”是的,我们可以,但考虑到其他答案中提到的所有原因,这将是一个坏主意。
scala> val x = List(1,2,3)
x: List[Int] = List(1, 2, 3)

scala> val y = x ::: 4 :: Nil
y: List[Int] = List(1, 2, 3, 4)