このような組み込み関数はありませんが、独自の関数を作成するのは簡単です。例のために、私はFoo
がシンプルであると仮定していますString
とverifySimilitude
は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
の行動に応じてequals
とhashCode
を実装ラッパークラスを作成することです。上記の例を再利用する、このようになります。同じ結果と
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
を定義できるときだけ意味があるので、限られたアプリケーションを持っています。
ありがとう!非常に興味深い解決策 - 私はハッシュコードを1つ好きですが、あなたが言ったように、それは難しいかもしれません。 – Randomize