0

当我在下面运行代码时,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)
  }

}
4

2 回答 2

5
  1. List是面向前置的数据结构。附加到它具有O(n)的复杂性,而前置 - O(1)
  2. List是一个不可变的数据结构,这就是为什么你不能修改一个现有的值,但你可以基于它获得一个新的值。想想StringInt

考虑到上述情况,要获得最佳结果,您应该将代码更新为以下内容:

  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
于 2013-07-25T17:03:15.963 回答
3

附加到一个不可变List对象会将元素附加到一个新的List. 由于userList它是不可变的,因此它一直是并且将永远List.empty是它被分配的内容。

要获取userList附加用户后的大小,请返回List使用附加创建的新用户以获得正确的大小。在 Scala 中,方法的最后一行是返回值。由于userList :+ ...返回一个新的Listthis 相当于分配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
于 2013-07-25T16:56:43.590 回答