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 distinctchứ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ó distinctBychứ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, toMutableSetvà 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 Setthay vì a Listvà sẽ hiệu quả hơn một chút so với distinct.
Bạn có thể thấy hữu ích:
toSethoặc toMutableSetloại nào có chi phí thấp hơn distinctvà nếu việc đặt hàng không thành vấn đề, bạn có thể sử dụng toHashSet.
to*Sethiệu quả hơn (không gian và thời gian) hơn là distinct[By]vì nó trả về Settrực tiếp thay vì sử dụng Setnội bộ và chuyển đổi nó thành a Listdưới dạng giá trị trả về của nó và 2) distinctBylà 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 distinctvới distinctBy(và không phải với to*Set).
Iterable.distinctthực sự là toMutableSet().toList()nội bộ. Vì vậy, đừng lo lắng về hiệu suất :-)