Kotlin - Cách dễ hiểu để loại bỏ các chuỗi trùng lặp khỏi mảng?


Câu trả lời:


202

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:


5
Bạn cũng có thể sử dụng 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.
mfulton26

@ mfulton26, chắc chắn nó không phải lúc nào cũng có chi phí. Ví dụ như một đối tượng thực thể JPA có thể có các trường lười nạp, do đó, nó hiệu quả hơn để phân biệt bộ sưu tập của mình bằng id hơn thực hiện đầy đủ so sánh
Buckstabue

2
@Buckstabue Tôi hiểu rồi, tôi tin rằng chúng ta đang nói về hai vấn đề khác nhau: 1) 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).
mfulton 26

1
@ mfulton26, bạn nói đúng. Tôi chủ yếu có nghĩa là đôi khi nó tốt hơn để sử dụng Danh sách + distinctBy hơn Set, vì Set sâu sử dụng bình đẳng / hashCode mà có khả năng có thể rất tốn kém để gọi
Buckstabue

1
Tại thời điểm viết bài, Iterable.distinctthực sự là toMutableSet().toList()nội bộ. Vì vậy, đừng lo lắng về hiệu suất :-)
Luke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.