在Scala列表中覆盖重复值

时间:2011-10-31 15:04:26

标签: scala

我有以下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")

提前感谢您的帮助,非常感谢:)

2 个答案:

答案 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以删除旧的匹配值。

相关问题