Dodawanie elementu na końcu listy w Scali

Nie mogę dodać elementu typu T do listy List[T]. Próbowałem z myList ::= myElement, ale wygląda na to, że tworzy dziwny obiekt i dostęp do myList.last zawsze zwraca pierwszy element, który został umieszczony wewnątrz listy. Jak mogę rozwiązać ten problem?

 231
Author: Usama Abdulrehman, 2011-10-17

5 answers

List(1,2,3) :+ 4

Results in List[Int] = List(1, 2, 3, 4)

Zauważ, że operacja ta ma złożoność O (n). Jeśli ta operacja jest potrzebna często lub w przypadku długich list, rozważ użycie innego typu danych(np. bufora list).

 407
Author: Landei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-11 15:41:13

To dlatego, że nie powinieneś tego robić (przynajmniej z niezmienną listą). Jeśli naprawdę musisz dołączyć element do końca struktury danych, a ta struktura danych naprawdę musi być listą, a ta lista naprawdę musi być niezmienna, zrób to: {]}

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

Lub że:

List(1,2,3) ::: List(4)
 68
Author: agilesteel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-17 13:15:17

Listy w Scali nie są przeznaczone do modyfikacji. W rzeczywistości nie można dodawać elementów do Scali List; to jest niezmienna struktura danych, Jak Stringi Javy. To, co robisz, gdy "dodajesz element do listy" w Scali, to tworzenie nowej Listy z istniejącej listy . (Źródło)

Zamiast używać list do takich przypadków, proponuję albo użyć ArrayBuffer lub ListBuffer. Te struktury danych są zaprojektowane tak, aby dodano nowe elementy.

Wreszcie, po wykonaniu wszystkich operacji, bufor może zostać przekształcony w listę. Zobacz następujący przykład 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)
 30
Author: Markus Weninger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 11:01:46

Jest to podobne do jednej z odpowiedzi, ale w inny sposób:

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)
 4
Author: Venkat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-25 12:32:25

Możemy dodać lub poprzedzić dwie listy lub listę & array
Append:

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

Prepending:

var l = List[Int]()  
   for(x <- ar)  
    { l= x :: l } //prepending    
     l.foreach(println)   

Result:6 5 4 1 2 3
 2
Author: Ramesh Muthavarapu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-25 12:33:02