保留单个字段唯一性的案例类实例集合



假设您有一个案例类SearchQualifier,其中包含两个字段,leftright 。可以将其添加到某个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))

最新更新