2016-04-28 6 views
2

私は大文字と小文字のクラスのリストを持ち、インスタンスは互いに同じか類似しています。私はこのリストを「複製」から除外する必要があります。 Scalaでは、このようなものはありますか(擬似コード):Scalaのクラスのリストから一意の要素を抽出する方法

myList.unique ((obj1,obj2) => verifySimilitude(obj1,obj2)) 

def verifySimilitude(obj1:Foo, obj2:Foo):Boolean = // some logic to verify that objects are the same or at least similar 

私はそれを解決するために(コードシンプルに保つ)、それは良い解決策何ができるか疑問に思ってこれはかなり「デカルト」製品です。

答えて

4

このような組み込み関数はありませんが、独自の関数を作成するのは簡単です。例のために、私はFooがシンプルであると仮定していますStringverifySimilitudeは2つの文字列の最初の文字を比較します。

type Foo = String 

def verifySimilitude(obj1: Foo, obj2: Foo): Boolean = obj1.headOption == obj2.headOption 

val myList = List("aa", "bb", "cc", "a", "b", "c", "d") 

myList.foldLeft(List[String]()) { 
    case (accum, el) => if (accum.exists(verifySimilitude(el, _))) accum else el :: accum 
}.reverse 

結果:

res0: List[String] = List(aa, bb, cc, d) 

オルタナティブ(より効率的な)解決策は、あなたのverifySimilitudeの行動に応じてequalshashCodeを実装ラッパークラスを作成することです。上記の例を再利用する、このようになります。同じ結果と

class SimWrapper(val v:String) { 
    override def equals(other: Any): Boolean = other match { 
    case that: SimWrapper => that.v.headOption == v.headOption 
    case _ => false 
    } 

    override def hashCode(): Int = v.headOption.hashCode() 
} 

myList.map(new SimWrapper(_)).distinct.map(_.v) 

res1: List[String] = List(aa, bb, cc, d) 

第二のアプローチは、より効率的である(O(N)Oと比較(N ))、それはまた、特定のverifySimilitudeのために合理的に均一なhashCodeを定義できるときだけ意味があるので、限られたアプリケーションを持っています。

+0

ありがとう!非常に興味深い解決策 - 私はハッシュコードを1つ好きですが、あなたが言ったように、それは難しいかもしれません。 – Randomize

関連する問題