ลำดับการเรียงแบบกำหนดเอง
กำหนดฟังก์ชันเปรียบเทียบ
ลำดับการเรียงแบบกำหนดเอง เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
นอกเหนือจากลำดับเริ่มต้น
โดยค่าเริ่มต้น การเรียงลำดับจะเรียงจากน้อยไปมาก แต่ข้อมูลจริงต้องใช้กฎแบบกำหนดเอง เช่น เรียงตามความยาว ตามหลายฟิลด์ หรือตามค่าที่คำนวณได้
ฟังก์ชันเปรียบเทียบ คือส่วนที่ใช้ระบุกฎใด ๆ ที่คุณต้องการ
ฟังก์ชันตรวจว่าน้อยกว่า
ฟังก์ชันเปรียบเทียบสำหรับ sort.Slice มีลายเซ็นเป็น func(i, j int) bool ฟังก์ชันนี้ส่งกลับค่า true เมื่อองค์ประกอบที่ i ควรอยู่ก่อนองค์ประกอบที่ j
package main
import (
"fmt"
"sort"
)
func main() {
nums := []int{4, 1, 3}
less := func(i, j int) bool { return nums[i] < nums[j] }
sort.Slice(nums, less)
fmt.Println(nums)
}เรียงตามความยาวสตริง
แทนที่จะเรียงตามตัวอักษร ให้เปรียบเทียบค่า len() ของแต่ละสตริงเพื่อเรียงตามความยาว
package main
import (
"fmt"
"sort"
)
func main() {
words := []string{"pear", "fig", "banana"}
sort.Slice(words, func(i, j int) bool {
return len(words[i]) < len(words[j])
})
fmt.Println(words)
}เรียงโครงสร้างตามฟิลด์
เลือกฟิลด์ใด ๆ ของโครงสร้างมาใช้เปรียบเทียบ ในตัวอย่างนี้ เราเรียงผลิตภัณฑ์ตามราคา
package main
import (
"fmt"
"sort"
)
type Product struct {
Name string
Price int
}
func main() {
items := []Product{{"Pen", 3}, {"Book", 12}, {"Cup", 7}}
sort.Slice(items, func(i, j int) bool {
return items[i].Price < items[j].Price
})
fmt.Println(items)
}การเรียงลำดับหลายฟิลด์
หากค่าครั้งแรกเท่ากัน ให้เปรียบเทียบฟิลด์ที่สองเพื่อแยกลำดับ เรียงตามอายุ แล้วจึงตามชื่อ
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
func main() {
p := []Person{{"Zoe", 30}, {"Ann", 30}, {"Bob", 25}}
sort.Slice(p, func(i, j int) bool {
if p[i].Age != p[j].Age {
return p[i].Age < p[j].Age
}
return p[i].Name < p[j].Name
})
fmt.Println(p)
}กลับลำดับด้วย sort.Reverse
sort.Reverse จะครอบ sort.Interface เพื่อกลับลำดับของมัน และใช้คู่กับตัวช่วยอย่าง sort.IntSlice ได้
package main
import (
"fmt"
"sort"
)
func main() {
nums := []int{1, 4, 2, 3}
sort.Sort(sort.Reverse(sort.IntSlice(nums)))
fmt.Println(nums)
}sort.Interface
หากต้องการควบคุมอย่างเต็มที่ ให้ใช้งาน sort.Interface โดยต้องมีเมธอดสามรายการคือ Len(), Less(i, j int) bool และ Swap(i, j int)
package main
import (
"fmt"
"sort"
)
type ByLen []string
func (s ByLen) Len() int { return len(s) }
func (s ByLen) Less(i, j int) bool { return len(s[i]) < len(s[j]) }
func (s ByLen) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func main() {
w := []string{"ccc", "a", "bb"}
sort.Sort(ByLen(w))
fmt.Println(w)
}เรียงตามค่าที่คำนวณ
การเปรียบเทียบสามารถใช้นิพจน์ใด ๆ ได้ คุณสามารถเรียงตัวเลขตามระยะห่างสัมบูรณ์จากศูนย์
package main
import (
"fmt"
"sort"
)
func abs(n int) int {
if n < 0 {
return -n
}
return n
}
func main() {
nums := []int{-5, 2, -1, 3}
sort.Slice(nums, func(i, j int) bool {
return abs(nums[i]) < abs(nums[j])
})
fmt.Println(nums)
}เรียงลำดับโดยไม่คำนึงถึงตัวพิมพ์เล็กใหญ่
ใช้ strings.ToLower ภายในการเปรียบเทียบเพื่อไม่คำนึงถึงตัวพิมพ์เล็กใหญ่เมื่อเรียงลำดับสตริง
package main
import (
"fmt"
"sort"
"strings"
)
func main() {
w := []string{"banana", "Apple", "cherry"}
sort.Slice(w, func(i, j int) bool {
return strings.ToLower(w[i]) < strings.ToLower(w[j])
})
fmt.Println(w)
}Slice เทียบกับอินเทอร์เฟซ
มีสองวิธีในการปรับแต่งลำดับ:
sort.Slice- ฟังก์ชันตรวจว่าน้อยกว่าแบบเขียนแทรกที่รวดเร็วsort.Interface- ชนิดที่มีชื่อและนำกลับมาใช้ซ้ำได้ พร้อมเมธอดสามรายการ
ควรเลือกใช้ sort.Slice สำหรับการเรียงลำดับที่ใช้เพียงครั้งเดียว
ทำให้การเปรียบเทียบไม่มีผลข้างเคียง
ฟังก์ชันเปรียบเทียบควรอ่านองค์ประกอบและส่งกลับค่า bool เท่านั้น ฟังก์ชันนี้ต้องไม่แก้ไขสไลซ์หรือก่อให้เกิดผลข้างเคียง มิฉะนั้นการเรียงลำดับอาจทำงานอย่างคาดเดาไม่ได้
ตรวจสอบอย่างรวดเร็ว
คุณต้องการเรียงบุคคลตามอายุ และเรียงตามชื่อเมื่ออายุเท่ากัน คุณจะใช้เทคนิคใด
ทบทวน
คุณสามารถกำหนดลำดับแบบใดก็ได้:
- ฟังก์ชันตรวจว่าน้อยกว่าใช้ระบุกฎของคุณ
- การเรียงหลายฟิลด์จะเปรียบเทียบฟิลด์ที่สองเมื่อค่าแรกเท่ากัน
sort.Reverseใช้กลับลำดับ ส่วนsort.Interfaceใช้สร้างชนิดที่นำกลับมาใช้ซ้ำได้
คำถามที่พบบ่อย
บทเรียน “ลำดับการเรียงแบบกำหนดเอง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ลำดับการเรียงแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ลำดับการเรียงแบบกำหนดเอง”
กำหนดฟังก์ชันเปรียบเทียบ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ลำดับการเรียงแบบกำหนดเอง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเรียงลำดับสไลซ์
- ลำดับการเรียงแบบกำหนดเอง
- การค้นหาข้อมูลที่เรียงแล้ว
- การเรียงลำดับแบบคงเสถียรภาพ