0Pricing
Go Academy · บทเรียน

ลำดับการเรียงแบบกำหนดเอง

กำหนดฟังก์ชันเปรียบเทียบ

ลำดับการเรียงแบบกำหนดเอง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเรียงลำดับสไลซ์
  2. ลำดับการเรียงแบบกำหนดเอง
  3. การค้นหาข้อมูลที่เรียงแล้ว
  4. การเรียงลำดับแบบคงเสถียรภาพ
← กลับไปที่ Go Academy