Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
覆盖Scala列表中的重复值_Scala - Fatal编程技术网

覆盖Scala列表中的重复值

覆盖Scala列表中的重复值,scala,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) => {

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

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

如果您将
UserItem
从一个直接的case类(我假设)调整为一个覆盖等于忽略
stamp
字段的类,那么您可以将
users
设置为
集合


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

如果您将
UserItem
从一个直格类(我假设)调整为一个覆盖等于忽略
stamp
字段的类,那么您可以将
users
设置为一个
集合


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

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

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

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

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

作为旁注,您可以简单地将其作为对象进行匹配,而不是提取和重建
UserItem
。您还应该在
列表
前加前缀,或者使用
向量
;附加到列表执行得非常糟糕
case u:UserItem=>users::=u
。作为旁注,您不需要提取和重建
UserItem
,只需将其作为对象进行匹配即可。您还应该在
列表
前加前缀,或者使用
向量
;附加到列表执行得非常糟糕<代码>案例u:UserItem=>用户::=u