如何附加到不可变列表?

时间:2013-07-25 16:50:29

标签: scala

当我在代码下运行时,userList的大小为0.我希望它包含User类型的对象,因为我将在下面附加到它们。我没有正确地附加到List userList?

object SimilarityData {

  val userList = List.empty[User]
  case class User(id: String, nCoordinate : Int) 

  def getUsers(): List[User] =
    {

      userList :+
        new User("1", 101010101) :+
        new User("2", 111011101) :+
        new User("3", 101010101) :+
        new User("4", 101110101) :+
        new User("5", 101110101) :+
        new User("6", 101011101) :+
        new User("7", 101010101) :+
        new User("8", 101010101) :+
        new User("9", 111000111);

      userList
    }

  def main(args: Array[String]) {
    println(userList.size)
  }

}

2 个答案:

答案 0 :(得分:5)

  1. List是面向前置的数据结构。附加到 O(n)的复杂性,而前置 - O(1)
  2. List是一个不可变的数据结构,这就是为什么你不能修改现有值,但你可以根据它获得一个新值。考虑StringInt
  3. 考虑到上述情况,为了获得最佳效果,您应该将代码更新为以下内容:

      def getUsers : List[User] =
        new User("1", 101010101) +:
        new User("2", 111011101) +:
        new User("3", 101010101) +:
        new User("4", 101110101) +:
        new User("5", 101110101) +:
        new User("6", 101011101) +:
        new User("7", 101010101) +:
        new User("8", 101010101) +:
        new User("9", 111000111) +:
        userList
    

答案 1 :(得分:3)

追加到不可变的List会将元素追加到新的List。由于userList是不可变的,因此它始终是List.empty,这是它所分配的。

要在追加用户之后获得userList的大小,请返回使用附加创建的新List以获得正确的大小。在Scala中,方法的最后一行是返回值。由于userList :+ ...返回新的List,这相当于将userList分配给某个返回值并返回该值。

object SimilarityData {

  val userList = List.empty[User]
  case class User(id: String, nCoordinate : Int) 

  def getUsers(): List[User] =
    {
      userList :+
        new User("1", 101010101) :+
        new User("2", 111011101) :+
        new User("3", 101010101) :+
        new User("4", 101110101) :+
        new User("5", 101110101) :+
        new User("6", 101011101) :+
        new User("7", 101010101) :+
        new User("8", 101010101) :+
        new User("9", 111000111);    
    }

  def main(args: Array[String]) {
    println(getUsers.size)
  }

}

运行它:

scala> SimilarityData.main(Array[String]())
9