Scalaでリストから重複を削除するにはどうすればよいですか?


94

私が持っていると仮定します

val dirty = List("a", "b", "a", "c")

「a」、「b」、「c」を返すリスト操作はありますか

回答:


175

SeqのScalaDocを見てください。

scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)

アップデート。他のユーザーはSetではなくを使用することを提案していListます。それは問題ありSetませんが、デフォルトでは、インターフェースは要素の順序を保持しないことに注意してください。あなたは明示的に設定の実装に使用することをお勧めしますないよう、順序を保持しcollection.mutable.LinkedHashSet


2
ファイルのリストがあり、ファイル名の一部などを比較する必要がある場合はどうなりますか?
オゾン

4
@ozone興味深い質問です。多分最も簡単な方法は、キーが対象のファイル名の一部である タイプの新しいマップを作成するMap[String, File]ことです。マップが構築さvaluesれたら、メソッドを呼び出してIterable値のを取得できます。キーはすべて構築によって区別されます。
キプトンバロス

@KiptonBarrosと私はのgroupByメンバーを使用してこれを行うことができると思いますscala.collection.Iterable[A]
Louis-Jacob Lebel

18

scala.collection.immutable.List.distinctメソッドがあります。

したがってdirty.distinctSetやに変換しなくても呼び出しが可能になりましたSeq


1
.distinctはに対して定義されていませんscala.collection.Iterable[A]。したがって、その場合、これを機能させるdirtyには、Seqまたはへのアップグレードを使用する必要がありますSet(つまり.toList.toSeqまたは.toSetメンバーのいずれかを使用)。
Louis-Jacob Lebel

15

Kitponのソリューションを使用する前に、Setではなくを使用することを検討してくださいList。これにより、各要素が一意になります。

ほとんどのリスト操作として(foreachmapfilter、...)のセットとリストで同じです、コレクションを変更することは非常に簡単なコードである可能性があります。


7

もちろん、そもそもSetを使用するのが正しい方法ですが、

scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)

動作します。またはtoSetそれがサポートするのと同じようにシーケンス Traversable インターフェース。


1
Set実装Traversableではなく実装のため、私はあなたの回答を編集しましたSeq。違いはSeq、要素への順序を保証するが、保証Traversableはしないことです。
キプトンバロス2011

-3

inArr.distinct foreach println _


これは望ましい出力を出力しますが、OPはそれを(おそらくリストとして)返すように求めていませんか?
RobP 14

-4

アルゴリズム的な方法...

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 " "
}

1
彼は文字列ではなくリストを持っています。これは質問の答えにはなりません。
Tim Gautier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.