2017-01-29 17 views
0

ケースクラスSearchQualifierに、leftrightの2つのフィールドがあるとします。検索の対象とする場合は、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に基づいて修飾子の一意性を維持するためにクリーンな方法はありますか?

私の現在のアプローチは、マップキーがleftあるMap[String, Qualifier]を使用していますが、それはハックのように感じている:

map = map + (qual.left -> qual) 

を理想的には、私はSet様行動を好むだろう。しかし、SearchQualifier("date", "January 1, 2000")SearchQualifier("date", "December 31, 1999")ではないので、equalsleftにだけ書き換えるのは正しいとは思いません。ではありません。

答えて

1

Mapはここでは完全なデータ構造であり、ハックではありません。 Mapを基本的にSetと考えると、それぞれの要素が値に結びついているのが理にかなっています。実際にはMapには.keySetというメソッドがあり、キーはこの引数をサポートするSetとして返されます。あなたが指摘したように、.equalsを無効にして、その動作をSetで取得するのは本当に紛らわしいでしょう。

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)) 
関連する問題