Giả sử tôi có
val dirty = List("a", "b", "a", "c")
Có một hoạt động danh sách trả về "a", "b", "c"
Giả sử tôi có
val dirty = List("a", "b", "a", "c")
Có một hoạt động danh sách trả về "a", "b", "c"
Câu trả lời:
Hãy xem ScalaDoc cho Seq ,
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
Cập nhật . Những người khác đã đề xuất sử dụng Sethơn là List. Điều đó tốt, nhưng hãy lưu ý rằng theo mặc định, Setgiao diện không bảo toàn thứ tự phần tử. Bạn có thể muốn sử dụng thực hiện Set rằng rõ ràng không giữ gìn trật tự, chẳng hạn như collection.mutable.LinkedHashSet .
Map[String, File], nơi các phím là một phần của tên tập tin quan tâm. Khi bản đồ được xây dựng, bạn có thể gọi valuesphương thức để nhận một Iterabletrong các giá trị - tất cả các khóa sẽ khác nhau theo cấu trúc.
groupBythành viên của scala.collection.Iterable[A].
scala.collection.immutable.Listbây giờ có một .distinctphương pháp.
Vì vậy, dirty.distinctbây giờ có thể gọi mà không cần chuyển đổi thành Sethoặc Seq.
.distinctkhông được xác định cho scala.collection.Iterable[A]. Vì vậy, trong trường hợp đó, bạn sẽ phải sử dụng nâng cấp dirtyđến một Seqhoặc một Setanyways (ví dụ bằng cách sử dụng một trong hai .toList, .toSeqhoặc .toSetthành viên) cho việc này để làm việc.
Tất nhiên, sử dụng Set ngay từ đầu là cách làm đúng, nhưng:
scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)
Làm. Hoặc chỉ toSetvì nó hỗ trợSeq Traversable giao diện.
Setcụ Traversable, không phải Seq. Sự khác biệt là Seqđảm bảo một thứ tự cho các phần tử, trong khi Traversablethì không.
Cách thuật toán ...
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 " "
}