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?
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).
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)
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)
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)
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
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