การลบข้อมูลซ้ำใน Slices บนภาษา Go
Nuttavut Thongjor
Go

เรียนรู้การลบข้อมูลซ้ำใน Slices บนภาษา Go พร้อมเรียงลำดับข้อมูลใน Slice ไปในตัว

คำอธิบาย
ความคิดเห็น

การใช้โครงสร้างข้อมูลแบบ Map เพื่อจัดเก็บข้อมูลไม่ซ้ำจะมีประสิทธิภาพที่ดีกว่า

ภาษา Go มีแพคเกจชื่อ slices ที่มีฟังก์ชันต่าง ๆ ให้เราเรียกใช้งานเพื่อจัดการกับ Slices ที่มีอยู่

สมมติเรามี slices ชื่อ s1 ที่มีข้อมูลซ้ำ ดังนี้

Go
1package main
2
3import (
4 "fmt"
5 "slices"
6)
7
8func main() {
9 s1 := []int{-1, 1, 2, -1, 0, 1}
10}

หากเราต้องการลบข้อมูลซ้ำออกไปด้วยการใช้แพคเกจ slices เราสามารถเริ่มต้นได้จากการเรียงลำดับข้อมูลใน s1 จากน้อยไปหามากก่อนดังนี้

Go
1package main
2
3import (
4 "fmt"
5 "slices"
6)
7
8func main() {
9 s1 := []int{-1, 1, 2, -1, 0, 1}
10
11 slices.Sort(s1)
12}

ภายหลังการเรียงลำดับข้อมูล เราจะใช้ฟังก์ชัน Compact ของแพคเกจ slices เพื่อกำจัดข้อมูลซ้ำที่อยู่ติด ๆ กันออกไป

Go
1package main
2
3import (
4 "fmt"
5 "slices"
6)
7
8func main() {
9 s1 := []int{-1, 1, 2, -1, 0, 1}
10
11 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

Go
1package main
2
3import (
4 "fmt"
5 "slices"
6)
7
8func 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 ในการลบข้อมูลซ้ำออกได้อย่างง่ายดายอีกด้วย