การจัดการ Deduplicating Collection Items ใน Kotlin

TopToppy
odds.team
Published in
2 min readMay 27, 2023
Photo by Karen Vardazaryan on Unsplash

เราจะมาเรียนรู้วิธีการจัดการความซ้ำซ้อนของข้อมูลใน 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:

--

--