Scala에서 목록에서 중복을 제거하려면 어떻게해야합니까?


94

내가 가지고 있다고 가정

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

"a", "b", "c"를 반환하는 목록 작업이 있습니까?

답변:


175

ScalaDoc for Seq를 살펴보십시오 .

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

업데이트 . 다른 사람은 사용 제안 Set이 아니라 List. 괜찮지 만 기본적으로 Set인터페이스는 요소 순서를 유지하지 않습니다. 명시 적으로있는 설정 구현을 사용할 수 있습니다 않습니다 같은 순서를 유지 collection.mutable.LinkedHashSet을 .


2
파일 목록이 있고 파일 이름의 일부와 같은 항목을 비교해야하는 경우 어떻게합니까?
ozone

4
@ozone 흥미로운 질문입니다. 가장 쉬운 방법은 키가 관심있는 파일 이름의 일부인 유형 의 새 을 만드는 Map[String, File]것입니다. 맵이 생성되면 values메서드를 호출하여 Iterable값 을 가져올 수 있습니다 . 키는 모두 생성에 따라 구분됩니다.
Kipton Barros

@KiptonBarros 나는 당신이 사용하여이 작업을 수행 할 수 있다고 생각 groupBy의 멤버 scala.collection.Iterable[A].
Louis-Jacob Lebel

18

scala.collection.immutable.List 지금은 .distinct 방법이 있습니다.

따라서 dirty.distinct이제 Set또는 로 변환하지 않고도 호출 이 가능합니다 Seq.


1
.distinct에 대해 정의되지 않았습니다 scala.collection.Iterable[A]. 그래서 경우에, 당신은 업그레이드를 사용해야 할 것 dirtyA를 Seq하거나 Set어쨌든 (예 중 하나를 사용하여 .toList, .toSeq또는 .toSet회원)이 작업을 수행하려면.
Louis-Jacob Lebel

15

Kitpon의 솔루션을 사용하기 전에 a Set대신 a를 사용하여 List각 요소가 고유한지 확인하십시오.

대부분의 목록 작업으로 ( foreach, map, filter, ...) 세트 목록에 대해 동일합니다, 수집을 변경하는 것은 매우 쉬운 코드의 수 있습니다.


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그렇지 않다는 것입니다.
Kipton Barros

-3

inArr.distinct foreach println _


이것은 원하는 출력을 인쇄합니다. OP가 (아마도 목록으로) 반환을 요청하지 않았습니까?
RobP

-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.