我有元素的Set
已在平等圍繞一個鍵定義,但其他領域可以是不同的。所以,當我需要「更新」,這是我已經試過:如何「更新」一個不可變的Scala中的不可變元素?
object sandbox {
case class K(val id: Int, val message: String) {
override def equals(that: Any) = that match {
case K(this.id, _) => true
case _ => false
}
override def hashCode = this.id
override def toString = "(" + id + "," + message + ")"
}
val s = Set(K(1, "a"), K(2, "b")) //> s : scala.collection.immutable.Set[test.sandbox.K] = Set((1,a), (2,b))
val updatedElem = K(1, "c") //> updatedElem : test.sandbox.K = (1,c)
s + updatedElem //> res0: scala.collection.immutable.Set[test.sandbox.K] = Set((1,a), (2,b))
Set(updatedElem) | s //> res1: scala.collection.immutable.Set[test.sandbox.K] = Set((1,c), (2,b))
}
添加已經存在的元素不會改變集合,並且先刪除它並再次添加更新似乎是次優。
union
方法在左側保留了該組的元素,但該行爲沒有記錄;所以我不應該依賴它。
那麼現在有什麼更明顯的我失蹤了嗎?我應該依賴實際行爲(並且爲了防止它發生變化而編寫測試)?還是應該分兩步進行更新?
該集合正在使用僅依賴於'id'的哈希碼。這意味着'K(1,「a」)== K(1,「c」)'並且會解釋set不會添加(沒有拋出異常)。嘗試使用不同消息的哈希值。 – korefn
那麼我會得到兩個對象,而不是前一個替換 – fortran