我有以下Comet服务器:
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 :(得分:2)
这听起来像是一个需要地图而不是列表的经典案例。我不知道Lift / Comet的细节,但我想你想要像
这样的东西 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 :(得分:1)
如果您将UserItem
从直接案例类(我假设)调整为覆盖等于忽略stamp
字段的那个,那么您可以将users
变为Set
。
或者,您可以在追加之前过滤List
以删除旧的匹配值。