假设您有一个案例类SearchQualifier
,其中包含两个字段,left
和 right
。可以将其添加到某个SearchQuery
类的实例中以限定搜索(例如 SearchQualifier("date", "January 1, 2000")
)。
case class SearchQualifier(left: String, right: String)
现在,假设您有一组SearchQualifiers
。如果使用与另一个限定符相同的left
向集合添加新限定符,则您的意图是重写以前的值。例如:
qualifiers = qualifiers + Qualifier("date", "January 1, 2000")
...
qualifiers = qualifiers + Qualifier("date", "December 31, 1999") // override
有没有一种干净的方法来保留基于left
的限定符的唯一性?
我目前的方法使用了一个Map[String, Qualifier]
,其中映射键是left
,但感觉像是黑客:
map = map + (qual.left -> qual)
理想情况下,我更喜欢类似Set
的行为。但是,我认为覆盖equals
只检查left
是不正确的,因为SearchQualifier("date", "January 1, 2000")
和SearchQualifier("date", "December 31, 1999")
不相等。
似乎Map
在这里是您的完美数据结构,根本不是黑客。 将Map
视为基本上是每个元素都与一个值相关联的Set
是完全合理的。 实际上,Map
有一个方法.keySet
其中键作为Set
返回给您,它支持此参数。 正如您所指出的,仅仅为了在Set
中获得该行为而覆盖.equals
确实会令人困惑。
我认为最简单的解决方案是使用TreeSet
val searchQualifierOrderingByLeft = new Ordering[SearchQualifier] {
override def compare(x: SearchQualifier, y: SearchQualifier): Int =
if (x.left == y.left) 0 else 1
}
val ts = TreeSet[SearchQualifier](SearchQualifier("l1", "r1"),
SearchQualifier("l1", "r2"),
SearchQualifier("l2", "r1"))(searchQualifierOrderingByLeft)
println(ts) // TreeSet(SearchQualifier(l1,r2), SearchQualifier(l2,r1))