เรียนรู้การลบข้อมูลซ้ำใน Slices บนภาษา Go พร้อมเรียงลำดับข้อมูลใน Slice ไปในตัว
การใช้โครงสร้างข้อมูลแบบ Map เพื่อจัดเก็บข้อมูลไม่ซ้ำจะมีประสิทธิภาพที่ดีกว่า
ภาษา Go มีแพคเกจชื่อ slices
ที่มีฟังก์ชันต่าง ๆ ให้เราเรียกใช้งานเพื่อจัดการกับ Slices ที่มีอยู่
สมมติเรามี slices ชื่อ s1 ที่มีข้อมูลซ้ำ ดังนี้
1package main23import (4 "fmt"5 "slices"6)78func main() {9 s1 := []int{-1, 1, 2, -1, 0, 1}10}
หากเราต้องการลบข้อมูลซ้ำออกไปด้วยการใช้แพคเกจ slices เราสามารถเริ่มต้นได้จากการเรียงลำดับข้อมูลใน s1 จากน้อยไปหามากก่อนดังนี้
1package main23import (4 "fmt"5 "slices"6)78func main() {9 s1 := []int{-1, 1, 2, -1, 0, 1}1011 slices.Sort(s1)12}
ภายหลังการเรียงลำดับข้อมูล เราจะใช้ฟังก์ชัน Compact
ของแพคเกจ slices
เพื่อกำจัดข้อมูลซ้ำที่อยู่ติด ๆ กันออกไป
1package main23import (4 "fmt"5 "slices"6)78func main() {9 s1 := []int{-1, 1, 2, -1, 0, 1}1011 slices.Sort(s1)12 s2 := slices.Compact(s1)13 fmt.Println(s1, s2) // [-1 0 1 2 0 0] [-1 0 1 2]14}
สุดท้ายเราจะได้ s2 ที่มีการเรียงข้อมูลจากมากไปหาน้อยพร้อมกับกำจัดค่าซ้ำออกไป
อย่างไรก็ตามวิธีข้างต้นจะพบว่าค่าของ s1 จะได้รับผลกระทบกล่าวคือมีการเรียงลำดับจากน้อยไปมากอันเป็นผลจากการเรียกใช้ Sort
ที่ทำการเปลี่ยนแปลงค่าโดยตรงไปยัง Slice ต้นฉบับ อย่างไรก็ตามหากเราไม่ต้องการให้ s1 มีการเปลี่ยนแปลงค่าเราสามารถทำการสำเนาข้อมูล s1
ออกมาเป็นอีกชุดข้อมูลก่อนได้โดยอาศัยฟังก์ชัน Clone
ของแพคเกจ slices
ซึ่งเป็นการคัดลอกข้อมูลแบบ Shallow Copy
1package main23import (4 "fmt"5 "slices"6)78func main() {9 s1 := []int{-1, 1, 2, -1, 0, 1}10 s2 := slices.Clone(s1)11 slices.Sort(s2)12 s3 := slices.Compact(s2)13 fmt.Println(s1, s3)14}
นอกเหนือจากใช้แพคเกจ slices
ของภาษา Go แล้วเรายังสามารถใช้แพคเกจ lo
เพื่อใช้ฟังก์ชัน lo.Uniq ในการลบข้อมูลซ้ำออกได้อย่างง่ายดายอีกด้วย