0Pricing
Go Academy · درس

ترتيبات فرز مخصّصة

عرّف دوال المقارنة

ترتيبات فرز مخصّصة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

تجاوز الترتيب الافتراضي

يكون الفرز الافتراضي تصاعديًا. لكن البيانات الحقيقية تحتاج إلى قواعد مخصصة: الفرز حسب الطول، أو حسب عدة حقول، أو حسب قيمة محسوبة.

تُعبّر دالة المقارنة عن أي قاعدة تريدونها.

دالة less

يكون توقيع دالة المقارنة في 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)
}

الشريحة مقابل الواجهة

هناك طريقتان لتخصيص الترتيب:

  • sort.Slice - دالة less سريعة ومضمّنة
  • sort.Interface - نوع مُسمّى قابل لإعادة الاستخدام، مع ثلاث دوال

فضّلوا sort.Slice لعمليات الفرز التي تُجرى لمرة واحدة.

حافظوا على نقاء المقارنات

ينبغي أن تقرأ دالة المقارنة العناصر فقط وتُعيد قيمة منطقية. ويجب ألا تعدّل الشريحة أو تُحدث آثارًا جانبية، وإلا فقد يتصرف الفرز بطريقة غير متوقعة.

اختبار سريع

تريدون فرز الأشخاص حسب العمر، ثم حسب الاسم عند تساوي الأعمار. ما الأسلوب الذي تستخدمونه؟

مراجعة

يمكنكم تحديد أي ترتيب للفرز:

  • تعبّر دالة less عن قاعدتكم
  • تقارن عمليات الفرز حسب عدة حقول حقلًا ثانيًا عند التعادل
  • تعكس sort.Reverse الترتيب؛ وتوفر sort.Interface أنواعًا قابلة لإعادة الاستخدام

الأسئلة الشائعة

هل درس «ترتيبات فرز مخصّصة» مجاني؟

نعم — نص درس «ترتيبات فرز مخصّصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «ترتيبات فرز مخصّصة»؟

عرّف دوال المقارنة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «ترتيبات فرز مخصّصة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ترتيب الشرائح
  2. ترتيبات فرز مخصّصة
  3. البحث في البيانات المرتّبة
  4. الفرز المستقر
← العودة إلى Go Academy