การจัดการ Deduplicating Collection Items ใน Kotlin
เราจะมาเรียนรู้วิธีการจัดการความซ้ำซ้อนของข้อมูลใน Kotlin ที่มีอย่างหลากหลายด้วยฟังก์ชันต่างๆ ที่มีให้ใช้งาน เช่น toSet()
, toHashSet()
, toMutableSet()
, และ distinct()
ดังนี้
โดยเริ่มต้นผมจะประกาศ class Book พร้อมทั้งประกาศ list ของ Book
เพื่อใช้ในตัวอย่างต่อไป
data class Book(val name: String)
// list of Book
val books = listOf(
Book("Java"),
Book("java"),
Book("Kotlin"),
Book("Kotlin"),
Book("JavaScript"),
Book("Dart"))
toSet()
- เปลี่ยน collection -> Set
- return
Set<T>
คืนค่าเป็น Set ที่ไม่สามารถแก้ไขได้ (immutable set) - ผลลัพธ์ที่ได้จะมีการเรียงลำดับสมาชิกตามลำดับเดิม
// Using the toSet() function
val toSet = books.toSet()
println(toSet.size) // size = 5
println(toSet)
//[Book(name=Java), Book(name=java), Book(name=Kotlin), Book(name=JavaScript), Book(name=Dart)]
toHashSet()
- เปลี่ยน Collection -> HashSet
- return
HashSet<T>
คืนค่าเป็น Set ที่สามารถแก้ไขได้ (mutable set) - ผลลัพธ์ที่ได้จะไม่มีการเรียงลำดับสมาชิก
- HashSet เป็นการทำงานผ่านวิธี hashing mechanism
// Using the toHashSet() function
val toHashBook = books.toHashSet()
println(toHashBook.size) // size = 5
println(toHashBook)
//[Book(name=Java), Book(name=java), Book(name=JavaScript), Book(name=Kotlin), Book(name=Dart)]
toMutableSet
- เปลี่ยน Collection -> MutableSet
- return
MutableSet<T>
คืนค่าเป็น Set ที่สามารถแก้ไขได้ (mutable set) - ผลลัพธ์ที่ได้จะมีการเรียงลำดับสมาชิกตามลำดับเดิมของ Collection
// Using the toMutableSet() function
val toMutableSet = books.toMutableSet()
println(toMutableSet.size) //size = 5
println(toMutableSet)
//[Book(name=Java), Book(name=java), Book(name=Kotlin), Book(name=JavaScript), Book(name=Dart)]
distinct
- Collection -> Array
- return
array<T>
สร้าง Array ที่ไม่มีสมาชิกที่ซ้ำกันอยู่ - ผลลัพธ์ที่ได้จะไม่มีการเรียงลำดับสมาชิก
นอกจากนี้ยังมีฟังก์ชัน distinctBy()
ที่สามารถใช้เพิ่มเงื่อนไขในการจัดการความซ้ำซ้อนได้ โดยระบุเงื่อนไขในการเลือกสมาชิกที่ไม่ซ้ำกันโดยใช้ lambda expression เช่น distinctBy { it.name }
เพื่อเลือกสมาชิกที่ไม่ซ้ำกันตาม attribute name
// Using the distinct() function
val distinct = books.distinct()
println(distinct.size) // 5
println(distinct)
//[Book(name=Java), Book(name=java), Book(name=Kotlin), Book(name=JavaScript), Book(name=Dart)]
// Using the distinctBy() function
val distinctBy1 = books.distinctBy { it.name }
println(distinctBy1.size) // 5
println(distinctBy1)
//[Book(name=Java), Book(name=java), Book(name=Kotlin), Book(name=JavaScript), Book(name=Dart)]
// Using the distinctBy() function
val distinctBy2 = books.distinctBy { it.name.toLowerCase() }
println(distinctBy2.size) // 4
println(distinctBy2)
//[Book(name=Java), Book(name=Kotlin), Book(name=JavaScript), Book(name=Dart)]
สรุป: เราสามารถใช้วิธีการง่ายๆ โดยใช้คุณสมบัติของ Set ที่ไม่อนุญาติให้มีสมาชิกที่ซ้ำกันอยู่ และสามารถเลือกใช้ฟังก์ชัน toSet()
, toMutableSet()
, toHashSet()
, หรือ distinct()
ได้ตามความต้องการของโปรแกรมเพื่อจัดการความซ้ำซ้อนใน Collection ในภาษา Kotlin
References:
- Kotlin Tips ~ Jetbrains Youtube