Kotlin - วิธีการลบสตริงที่ซ้ำกันออกจากอาร์เรย์?


คำตอบ:


213

ใช้distinctฟังก์ชันส่วนขยาย :

val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]

นอกจากนี้ยังมีdistinctByฟังก์ชั่นที่ช่วยให้สามารถระบุวิธีแยกแยะรายการ:

val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]

ในฐานะที่เป็น@ mfulton26แนะนำคุณยังสามารถใช้toSet, และถ้าคุณไม่จำเป็นต้องสั่งซื้อเดิมจะได้รับการเก็บรักษาไว้toMutableSet toHashSetฟังก์ชั่นเหล่านี้สร้าง a SetแทนListและควรจะมีประสิทธิภาพมากกว่าdistinct.


คุณอาจพบว่ามีประโยชน์:


5
คุณยังสามารถใช้toSetหรือtoMutableSetที่มีค่าใช้จ่ายน้อยกว่าdistinctและหากการสั่งซื้อไม่สำคัญว่าคุณสามารถtoHashSetใช้ได้
mfulton26

@ mfulton26 แน่นอนว่ามันไม่ได้มีค่าใช้จ่ายเสมอไป เช่นวัตถุเอนทิตี JPA สามารถมีช่องที่โหลดแบบขี้เกียจได้ดังนั้นจึงมีประสิทธิภาพในการแยกคอลเล็กชันตาม id มากกว่าทำการเปรียบเทียบแบบเต็ม
Buckstabue

2
@ Buckstabue ฉันเห็นฉันเชื่อว่าเรากำลังพูดถึงสองประเด็นที่แตกต่างกัน: 1) to*Setมีประสิทธิภาพ (ช่องว่างและเวลา) มากกว่าdistinct[By]เนื่องจากส่งคืนSetโดยตรงแทนที่จะใช้SetภายในและแปลงListเป็นค่าส่งคืนและ 2) distinctByคือ สามารถมีประสิทธิภาพมากกว่าdistinctเพียงเพราะคุณสามารถหลีกเลี่ยงการเปรียบเทียบความเท่าเทียมกันของวัตถุทั้งหมดได้ ทั้งสองเป็นคะแนนที่ถูกต้อง ฉันใช้คำพูดของคุณที่ว่า "แน่นอนว่ามันไม่มีค่าใช้จ่ายเสมอไป" และฉันก็ตอบกลับไปและมองข้ามไปว่าคุณกำลังเปรียบเทียบdistinctกับdistinctBy(ไม่ใช่กับto*Set)
mfulton26

1
@ mfulton26 คุณถูกต้อง ฉันส่วนใหญ่หมายความว่าบางครั้งควรใช้ List +
differentBy

1
ในขณะที่เขียนIterable.distinctจริงจะทำtoMutableSet().toList()ภายใน ไม่ต้องกังวลเรื่องประสิทธิภาพ :-)
ลุค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.