مرکزی مواد پر جائیں
ماڈیول 4 · سبق 5 از 5کورس میں 20/50~10 min
ماڈیول اسباق (5/5)

ترتیب پیکج کے ساتھ چھانٹنا

معیاری sort پیکیج سلائسز کو ان جگہ ترتیب دیتا ہے۔ بنیادی اقسام کے لیے (int, float64, string) براہ راست مددگار ہیں؛ آپ کے کسی دوسرے ٹکڑے کے لیے استعمال کریں sort.Slice ایک less(i, j int) bool فنکشن کے ساتھ جو آرڈر کرنا

بنیادی اقسام کے لیے مددگار

Go
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 سے پہلے آنا چاہئے:

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

ریورس میں ترتیب دینے کے لیے، صرف موازنہ کو پلٹائیں: return people[i].Age > people[j].Age

مستحکم ترتیب

sort.Slice کے مستحکم ہونے کی ضمانت نہیں ہے ("برابر" عناصر تبدیل ہو سکتے ہیں رشتہ دار آرڈر)۔ مستحکم ترتیب کے لیے استعمال کریں sort.SliceStable:

Go
sort.SliceStable(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
})

ایک سے زیادہ چابیاں کی طرف سے چھانٹ رہا ہے

عام پیٹرن: عمر کے لحاظ سے ترتیب دیں، اور برابر عمروں کے لیے نام کے لحاظ سے:

Go
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 پہلے سے ترتیب شدہ سلائسوں پر کام کرتا ہے:

Go
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5)   // 2

اگر عنصر وہاں نہیں ہے، تو یہ اندراج انڈیکس لوٹاتا ہے۔ آپ کھود سکتے ہیں۔ جب آپ کو ان کی ضرورت ہو تو تفصیلات میں۔

عمومیات (1.21+ پر جائیں): slices.Sort

stdlib میں slices پیکیج سے (1.21 پر جائیں):

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

زیادہ جدید، ٹائپ سیف API۔ sort.Slice کے ساتھ ہم آہنگ لیکن مزید ایرگونومک

اسے آزمائیں

ورزش#go.m4.l5.e1
کوششیں: 0لوڈ ہو رہا ہے…

sort.Ints کا استعمال کرتے ہوئے نمبروں کو صعودی ترتیب میں ترتیب دیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

`sort.Ints` جگہ میں ایک int سلائس کو ترتیب دیتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m4.l5.e2
کوششیں: 0لوڈ ہو رہا ہے…

sort.Slice کا استعمال کرتے ہوئے لوگوں کو عمر کے لحاظ سے صعودی ترتیب میں ترتیب دیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

کم فنکشن درست ہو جاتا ہے جب عنصر i کو j سے پہلے آنا چاہیے۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m4.l5.e3
تیار

آپ sort.Slice کے ساتھ نزولی ترتیب میں کیسے ترتیب دیتے ہیں؟

Go
sort.Slice(s, func(i, j int) bool { return ??? })
جواب کے اختیارات

Recap

  • sort.Ints / sort.Strings / sort.Float64s بنیادی اقسام کے لئے، جگہ جگہ۔
  • sort.Slice(s, less) کسی بھی قسم کے سلائسز کے لیے، ایک less(i, j) فنکشن کے ساتھ۔
  • sort.SliceStable مساوی کلیدوں کے لیے متعلقہ ترتیب کو محفوظ رکھنے کے لیے۔
  • متعدد کلیدوں کے حساب سے چھانٹنا: less کے اندر ifs کا جھرن۔
  • 1.21+ پر جائیں: slices پیکیج ایک عام API کے ساتھ (slices.Sort, slices.SortFunc)۔
  • نقشہ کی چابیاں کے لیے: ایک ٹکڑے میں نکالیں اور چھانٹیں۔