Skip to content

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)))
}

Golang تم تحريره بواسطة www.golangdev.cn