Misalkan saya punya
val dirty = List("a", "b", "a", "c")
Apakah ada operasi daftar yang mengembalikan "a", "b", "c"
Lihat ScalaDoc untuk Seq ,
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
Perbarui . Orang lain menyarankan untuk menggunakan Set
daripada List
. Tidak apa-apa, tetapi ketahuilah bahwa secara default, Set
antarmuka tidak mempertahankan urutan elemen. Anda mungkin ingin menggunakan implementasi Set yang secara eksplisit tidak mempertahankan ketertiban, seperti collection.mutable.LinkedHashSet .
Map[String, File]
, di mana kunci-kuncinya adalah bagian dari nama file yang diinginkan. Setelah peta dibuat, Anda dapat memanggilvalues
metode untuk mendapatkanIterable
nilai - semua kunci akan berbeda menurut konstruksi.groupBy
anggota dariscala.collection.Iterable[A]
.scala.collection.immutable.List
sekarang punya.distinct
metode.Jadi, panggilan
dirty.distinct
sekarang dapat dilakukan tanpa mengubah keSet
atauSeq
.sumber
.distinct
tidak ditentukan untukscala.collection.Iterable[A]
. Jadi dalam hal ini, Anda harus menggunakan upgradedirty
ke aSeq
atauSet
aways (yaitu dengan menggunakan salah satu.toList
,.toSeq
atau.toSet
anggota) agar ini berfungsi.Sebelum menggunakan solusi Kitpon, pertimbangkan untuk menggunakan a
Set
daripada aList
, ini memastikan setiap elemen unik.Seperti kebanyakan daftar operasi (
foreach
,map
,filter
, ...) adalah sama untuk set dan daftar, mengubah koleksi bisa sangat mudah dalam kode.sumber
Menggunakan Set di tempat pertama adalah cara yang tepat untuk melakukannya, tentu saja, tetapi:
Bekerja. Atau hanya
toSet
karena mendukung fileSeqTraversable
antarmuka.sumber
Set
mengimplementasikanTraversable
, bukanSeq
. Perbedaannya adalah yangSeq
menjamin ketertiban untuk elemen, sedangkanTraversable
tidak.Untuk Daftar yang Sudah Disortir
Jika Anda kebetulan ingin item berbeda dari daftar yang Anda tahu sudah diurutkan , seperti yang sering saya butuhkan, berikut ini bekerja sekitar dua kali kecepatannya
.distinct
:Hasil kinerja pada daftar 100.000.000 Ints acak dari 0-99:
Performa dengan MutableList atau ListBuffer
Meskipun tampaknya pendekatan pemrograman yang lebih dapat diubah / tidak berfungsi mungkin lebih cepat daripada mempersiapkan ke daftar yang tidak dapat diubah, praktik menunjukkan sebaliknya. Implementasi yang tidak dapat diubah secara konsisten berkinerja lebih baik. Dugaan saya untuk alasannya adalah bahwa scala memfokuskan pengoptimalan kompilernya pada koleksi yang tidak dapat diubah, dan melakukan pekerjaan dengan baik. (Saya menyambut orang lain untuk mengirimkan implementasi yang lebih baik.)
Implementasi:
Uji:
sumber
Anda juga dapat menggunakan rekursi dan pencocokan pola:
sumber
removeDuplicates(tail.filter(_ != head))
inArr.distinct untuk setiap println _
sumber
Cara algoritmik ...
sumber