Add element to a list In Scala

后端 未结 4 480
旧时难觅i
旧时难觅i 2020-12-03 01:04

I\'m running Scala 2.10.2. I want to create a list, then add some elements to the list and expect to see all the elements in the lists when I call the list\'s name. But I ob

相关标签:
4条回答
  • 2020-12-03 01:19

    You are using an immutable list. The operations on the List return a new List. The old List remains unchanged. This can be very useful if another class / method holds a reference to the original collection and is relying on it remaining unchanged. You can either use different named vals as in

    val myList1 = 1.0 :: 5.5 :: Nil 
    val myList2 = 2.2 :: 3.7 :: mylist1
    

    or use a var as in

    var myList = 1.0 :: 5.5 :: Nil 
    myList :::= List(2.2, 3.7)
    

    This is equivalent syntax for:

    myList = myList.:::(List(2.2, 3.7))
    

    Or you could use one of the mutable collections such as

    val myList = scala.collection.mutable.MutableList(1.0, 5.5)
    myList.++=(List(2.2, 3.7))
    

    Not to be confused with the following that does not modify the original mutable List, but returns a new value:

    myList.++:(List(2.2, 3.7))
    

    However you should only use mutable collections in performance critical code. Immutable collections are much easier to reason about and use. One big advantage is that immutable List and scala.collection.immutable.Vector are Covariant. Don't worry if that doesn't mean anything to you yet. The advantage of it is you can use it without fully understanding it. Hence the collection you were using by default is actually scala.collection.immutable.List its just imported for you automatically.

    I tend to use List as my default collection. From 2.12.6 Seq defaults to immutable Seq prior to this it defaulted to immutable.

    0 讨论(0)
  • 2020-12-03 01:25

    Use import scala.collection.mutable.MutableList or similar if you really need mutation.

    import scala.collection.mutable.MutableList
    val x = MutableList(1, 2, 3, 4, 5)
    x += 6 // MutableList(1, 2, 3, 4, 5, 6)
    x ++= MutableList(7, 8, 9) // MutableList(1, 2, 3, 4, 5, 6, 7, 8, 9)
    
    0 讨论(0)
  • 2020-12-03 01:31

    I will try to explain the results of all the commands you tried.

    scala> val l = 1.0 :: 5.5 :: Nil
    l: List[Double] = List(1.0, 5.5)
    

    First of all, List is a type alias to scala.collection.immutable.List (defined in Predef.scala).

    Using the List companion object is more straightforward way to instantiate a List. Ex: List(1.0,5.5)

    scala> l
    res0: List[Double] = List(1.0, 5.5)
    
    scala> l ::: List(2.2, 3.7)
    res1: List[Double] = List(1.0, 5.5, 2.2, 3.7)
    

    ::: returns a list resulting from the concatenation of the given list prefix and this list

    The original List is NOT modified

    scala> List(l) :+ 2.2
    res2: List[Any] = List(List(1.0, 5.5), 2.2)
    

    List(l) is a List[List[Double]] Definitely not what you want.

    :+ returns a new list consisting of all elements of this list followed by elem.

    The type is List[Any] because it is the common superclass between List[Double] and Double

    scala> l
    res3: List[Double] = List(1.0, 5.5)
    

    l is left unmodified because no method on immutable.List modified the List.

    0 讨论(0)
  • 2020-12-03 01:37

    Since you want to append elements to existing list, you can use var List[Int] and then keep on adding elements to the same list. Note -> You have to make sure that you insert an element into existing list as follows:-

    var l: List[int] = List() // creates an empty list

    l = 3 :: l // adds 3 to the head of the list

    l = 4 :: l // makes int 4 as the head of the list

    // Now when you will print l, you will see two elements in the list ( 4, 3)

    0 讨论(0)
提交回复
热议问题