2011-10-31 69 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追加之前刪除舊的匹配值。