sort
TIP
หากคุณเป็นนักพัฒนาเวอร์ชัน 1.21 ขึ้นไป ฉันแนะนำให้ใช้ไลบรารีมาตรฐาน slices สำหรับการเรียงลำดับ มันรองรับ generics และมีการออกแบบ API ที่สมเหตุสมผลกว่า
ในแพ็กเกจ sort ของ Go จัดเตรียมวิธีการเรียงลำดับที่ใช้งานโดย官方 ส่วนใหญ่สามารถใช้งานได้ทันที หากต้องการเรียงลำดับ struct ต้องใช้งานสามวิธีการภายใต้ sort.Interface คือ Len() swap() Less() เนื่องจาก官方ได้ใช้งานสามประเภท Float64Slice StringSlice IntSlice ไว้แล้ว ดังนั้นสามประเภทนี้ไม่ต้องใช้งานเองสามารถใช้ได้โดยตรง
go
type Interface interface {
// วิธีการความยาว
Len() int
// วิธีการเปรียบเทียบ
Less(i, j int) bool
// วิธีการสลับ
Swap(i, j int)
}การเรียงลำดับจำนวนเต็ม
go
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}การเรียงลำดับจุดลอยตัว
go
func main() {
floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
sort.Float64s(floats)
fmt.Println(floats)
}การเรียงลำดับสตริง
go
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}การเรียงลำดับแบบย้อนกลับ
ต้องห่อด้วย sort.Reverse ก่อนแล้วจึงเรียงลำดับ
go
func main() {
floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
sort.Sort(sort.Reverse(sort.Float64Slice(floats)))
fmt.Println(floats)
}การเรียงลำดับแบบกำหนดเอง
หากต้องการเรียงลำดับ struct แบบกำหนดเอง ต้องใช้งานสามวิธีการ
go
type Person struct {
UserId string
Username string
Age int
Address string
}
type PersonSlice []Person
// ส่งคืนความยาวของสไลซ์
func (p PersonSlice) Len() int {
return len(p)
}
// วิธีการเปรียบเทียบ
func (p PersonSlice) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
// วิธีการสลับ
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}เนื่องจากเปรียบเทียบตามอายุ ผลลัพธ์จึงเรียงลำดับตามขนาดของอายุ
go
func main() {
persons := []Person{{
UserId: "1",
Username: "wyh",
Age: 18,
Address: "us",
}, {
UserId: "2",
Username: "jack",
Age: 17,
Address: "ch",
}, {
UserId: "3",
Username: "mike",
Age: 15,
Address: "india",
}}
sort.Sort(PersonSlice(persons))
fmt.Println(persons)
}เรียงลำดับหรือไม่
ตรวจสอบว่าสไลซ์เรียงลำดับหรือไม่ ภายในจะไม่ดำเนินการเรียงลำดับ แต่ใช้การเรียก Less() แบบวนซ้ำเพื่อตรวจสอบ
go
func main() {
persons := []Person{{
UserId: "1",
Username: "wyh",
Age: 18,
Address: "us",
}, {
UserId: "2",
Username: "jack",
Age: 17,
Address: "ch",
}, {
UserId: "3",
Username: "mike",
Age: 15,
Address: "india",
}}
sort.Sort(PersonSlice(persons))
println(sort.IsSorted(PersonSlice(persons)))
}