假设您的案例类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")
不相等。
答案 0 :(得分:1)
在这里,Map
似乎是一个完美的数据结构,而不是一个黑客。将Map
视为基本上是Set
并将每个元素绑定到一个值,这是完全合理的。事实上,Map
有一个方法.keySet
,其中键作为Set
返回给你,它支持这个参数。正如您所指出的那样,覆盖.equals
只是为了在Set
中获取该行为确实会让您感到困惑。
答案 1 :(得分:0)
我认为最简单的解决方案是使用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))