2011-10-31 84 views
0

我有以下的彗星服务器:Scala的名单覆盖重复值

object UserServer extends LiftActor with ListenerManager { 

    private var users: List[UserItem] = Nil 

    def createUpdate = users 

    override def lowPriority = { 

     case UserItem(user, room, active, stamp) => { 

      users :+= UserItem(user, room, active, stamp); 
      updateListeners() 

     } 

    } 

} 

目前每次的形式提交了新的UserItem被添加到用户列表中。我想要做的每个服务器接收而不将它应使用相同的用户和房间手柄覆盖现有的项目列表中的新用户,时间。

因此,如果该列表包含以下内容:下一次,这些用户提交列表中的上述两个项目将与新的时间戳值被替换的形式

UserItem("jam_2323", "demo-room", "James", "1320073365") 
UserItem("jim_4533", "demo-room", "Jim", "1320073365") 

UserItem("jam_2323", "demo-room", "James", "1320073435") 
UserItem("jim_4533", "demo-room", "Jim", "1320073435") 

提前任何帮助,谢谢,非常感谢:)

+0

作为一个侧面说明,而不是提取和重建'UserItem',你可以简单地在它匹配的对象。你也应该预先添加到'List'中,或者使用'Vector';附加到列表表现非常差。 'u:UserItem => users :: = u'。 – leedm777

回答

2

这听起来像是你需要一个地图,而不是一个列表中的经典案例。我不知道电梯/彗星的细节,但我猜你想要的东西,像

case class User(id: String) 
    case class Activity(room: String, active: String, stamp: String) 

    var lastUserActivity = Map[User, Activity]() 
... 
    case UserItem(id, room, active, stamp) => { 
     lastUserActivity += User(id) -> Activity(room, active, stamp) 
    } 
1

如果你从一个直案例类调整UserItem(我假设)到是一个,你必须被覆盖的等于忽略stamp领域,那么你可以做usersSet

或者,您可以过滤List追加之前删除旧的匹配值。