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 Set
hơn là List
. Điều đó tốt, nhưng hãy lưu ý rằng theo mặc định, Set
giao 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 values
phương thức để nhận một Iterable
trong các giá trị - tất cả các khóa sẽ khác nhau theo cấu trúc.
groupBy
thành viên của scala.collection.Iterable[A]
.
scala.collection.immutable.List
bây giờ có một .distinct
phương pháp.
Vì vậy, dirty.distinct
bây giờ có thể gọi mà không cần chuyển đổi thành Set
hoặc Seq
.
.distinct
khô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 Seq
hoặc một Set
anyways (ví dụ bằng cách sử dụng một trong hai .toList
, .toSeq
hoặc .toSet
thà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ỉ toSet
vì nó hỗ trợSeq Traversable
giao diện.
Set
cụ 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 Traversable
thì 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 " "
}