دروس الوحدة (5/5)
الفرز باستخدام حزمة الفرز
تقوم الحزمة القياسية sort بفرز الشرائح في مكانها. للأنواع الأساسية
(int، float64، string) هناك مساعدين مباشرين؛ لأي شريحة أخرى لك
استخدم sort.Slice مع وظيفة less(i, j int) bool التي تحدد
الطلب.
مساعدين للأنواع الأساسية
import "sort"
nums := []int{5, 2, 8, 1}
sort.Ints(nums) // [1 2 5 8]
words := []string{"c", "a", "b"}
sort.Strings(words) // [a b c]
fs := []float64{1.5, 0.5, 2.5}
sort.Float64s(fs) // [0.5 1.5 2.5]يتم الفرز في المكان: يتم تغيير الشريحة الأصلية.
sort.Slice: فرز مخصص
قمت بتمرير الشريحة ووظيفة less، مع وجود مؤشرين i و
j، يتم إرجاع true إذا كان العنصر i يجب أن يأتي قبل j:
type Person struct {
Name string
Age int
}
people := []Person{
{"Bruno", 30},
{"Anna", 25},
{"Carla", 28},
}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
// Anna(25), Carla(28), Bruno(30)للفرز في الاتجاه المعاكس، ما عليك سوى قلب المقارنة: محمي_INLINE_14.
نوع مستقر
sort.Slice ليس مضمونًا أن يكون مستقرًا (قد تتغير العناصر المتساوية).
الترتيب النسبي). للحصول على فرز مستقر، استخدم sort.SliceStable:
sort.SliceStable(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})الفرز حسب مفاتيح متعددة
النمط الشائع: الفرز حسب العمر، وللأعمار المتساوية حسب الاسم:
sort.Slice(people, func(i, j int) bool {
if people[i].Age != people[j].Age {
return people[i].Age < people[j].Age
}
return people[i].Name < people[j].Name
})بحث ثنائي
sort.SearchInts / sort.Search يعمل على الشرائح التي تم فرزها بالفعل:
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5) // 2إذا لم يكن العنصر موجودًا، فإنه يُرجع فهرس الإدراج. يمكنك الحفر في التفاصيل عندما تحتاج إليها.
الأدوية العامة (الإصدار 1.21+): slices.Sort
من الحزمة slices في stdlib (انتقل إلى 1.21):
import "slices"
nums := []int{3, 1, 2}
slices.Sort(nums) // [1 2 3]
slices.SortFunc(people, func(a, b Person) int {
return a.Age - b.Age // -1/0/1
})واجهة برمجة تطبيقات أكثر حداثة وآمنة من حيث النوع. متوافق مع sort.Slice ولكن أكثر من ذلك
مريح.
جربه
فرز الأرقام بترتيب تصاعدي باستخدامsort.Ints.
إظهار التلميح
يقوم `sort.Ints' بفرز شريحة int في مكانها.
الحل متاح بعد 3 من المحاولات
فرز الأشخاص حسب العمر بترتيب تصاعدي باستخدامsort.Slice.
إظهار التلميح
ترجع الدالة less صحيحًا عندما يأتي العنصر i قبل j.
الحل متاح بعد 3 من المحاولات
كيف يمكنك الفرز بترتيب تنازلي باستخدامsort.Slice؟
sort.Slice(s, func(i, j int) bool { return ??? })خلاصة
sort.Ints/sort.Strings/sort.Float64sللأنواع الأساسية، في مكانها.sort.Slice(s, less)للشرائح من أي نوع، مع وظيفةless(i, j).sort.SliceStableللحفاظ على الترتيب النسبي للمفاتيح المتساوية.- الترتيب حسب مفاتيح متعددة: سلسلة من
ifs داخلless. - انتقل إلى الإصدار 1.21+:
slicesالحزمة مع واجهة برمجة التطبيقات العامة (slices.Sort،slices.SortFunc). - بالنسبة لمفاتيح الخريطة: قم باستخراجها إلى شريحة وفرزها.