案例类实例的集合,保留单个字段

时间:2017-01-29 17:14:14

标签: scala collections case-class

假设您的案例类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") 相等。

2 个答案:

答案 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))