私が持っていると仮定します
val dirty = List("a", "b", "a", "c")
「a」、「b」、「c」を返すリスト操作はありますか
私が持っていると仮定します
val dirty = List("a", "b", "a", "c")
「a」、「b」、「c」を返すリスト操作はありますか
回答:
SeqのScalaDocを見てください。
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
アップデート。他のユーザーはSetではなくを使用することを提案していListます。それは問題ありSetませんが、デフォルトでは、インターフェースは要素の順序を保持しないことに注意してください。あなたは明示的に設定の実装に使用することをお勧めしますないよう、順序を保持しcollection.mutable.LinkedHashSet。
groupByメンバーを使用してこれを行うことができると思いますscala.collection.Iterable[A]。
scala.collection.immutable.List今.distinctメソッドがあります。
したがってdirty.distinct、Setやに変換しなくても呼び出しが可能になりましたSeq。
.distinctはに対して定義されていませんscala.collection.Iterable[A]。したがって、その場合、これを機能させるdirtyには、Seqまたはへのアップグレードを使用する必要がありますSet(つまり.toList、.toSeqまたは.toSetメンバーのいずれかを使用)。
もちろん、そもそもSetを使用するのが正しい方法ですが、
scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)
動作します。またはtoSetそれがサポートするのと同じようにシーケンス Traversable インターフェース。
Set実装Traversableではなく実装のため、私はあなたの回答を編集しましたSeq。違いはSeq、要素への順序を保証するが、保証Traversableはしないことです。
アルゴリズム的な方法...
def dedupe(str: String): String = {
val words = { str split " " }.toList
val unique = words.foldLeft[List[String]] (Nil) {
(l, s) => {
val test = l find { _.toLowerCase == s.toLowerCase }
if (test == None) s :: l else l
}
}.reverse
unique mkString " "
}