Làm thế nào để loại bỏ các bản sao khỏi một Array<String?>
trong kotlin?
Câu trả lời:
Sử dụng distinct
chức năng mở rộng :
val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]
Ngoài ra còn có distinctBy
chức năng cho phép người ta chỉ định cách phân biệt các mục:
val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]
Như @ mfulton26 gợi ý, bạn cũng có thể sử dụng toSet
, toMutableSet
và nếu bạn không cần phải đặt hàng ban đầu để được bảo toàn, toHashSet
. Các hàm này tạo ra một Set
thay vì a List
và sẽ hiệu quả hơn một chút so với distinct
.
Bạn có thể thấy hữu ích:
toSet
hoặc toMutableSet
loại nào có chi phí thấp hơn distinct
và nếu việc đặt hàng không thành vấn đề, bạn có thể sử dụng toHashSet
.
to*Set
hiệu quả hơn (không gian và thời gian) hơn là distinct[By]
vì nó trả về Set
trực tiếp thay vì sử dụng Set
nội bộ và chuyển đổi nó thành a List
dưới dạng giá trị trả về của nó và 2) distinctBy
là có thể hiệu quả hơn distinct
đơn giản vì bạn có thể tránh so sánh bình đẳng đối tượng đầy đủ. Cả hai đều là điểm hợp lệ. Tôi đã chạy với tuyên bố của bạn rằng "chắc chắn nó không phải lúc nào cũng có chi phí" và tôi đã trả lời điều đó và bỏ qua rằng bạn đang so sánh distinct
với distinctBy
(và không phải với to*Set
).
Iterable.distinct
thực sự là toMutableSet().toList()
nội bộ. Vì vậy, đừng lo lắng về hiệu suất :-)