sort
TIP
إذا كنت مطوراً بإصدار 1.21 أو أعلى، أنصحك باستخدام المكتبة القياسية slices للترتيب، فهي تدعم الأنواع العامة، وتصميم واجهة برمجة التطبيقات أكثر منطقية.
في Go، توفر حزمة sort طرق ترتيب رسمية، معظمها يمكن استخدامه مباشرة. أما إذا أردت ترتيب الهياكل فيجب تنفيذ الطرق الثلاث Len() و Swap() و Less() من واجهة sort.Interface. وبما أن المسؤولين قد نفذوا لنا ثلاثة أنواع 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)
}الترتيب المخصص
إذا كنت تريد ترتيب هيكل مخصص، فيجب تنفيذ الطرق الثلاث.
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)))
}