私が持っていると仮定します
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 " "
}