2013-07-25 26 views
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) 
    } 

} 

回答

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 
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