মূল কন্টেন্টে যান
মডিউল 4 · 5-এর পাঠ 5কোর্সে 20/50~10 min
মডিউল পাঠ (5/5)

সাজানোর প্যাকেজ দিয়ে সাজানো

স্ট্যান্ডার্ড sort প্যাকেজটি স্লাইসগুলিকে স্থানে সাজায়৷ বেস ধরনের জন্য (int, float64, string) সরাসরি সাহায্যকারী আছে; অন্য কোন টুকরা জন্য আপনি একটি less(i, j int) bool ফাংশনের সাথে sort.Slice ব্যবহার করুন যা সংজ্ঞায়িত করে আদেশ

বেস ধরনের জন্য সাহায্যকারী

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 এর সাথে সামঞ্জস্যপূর্ণ কিন্তু আরো ergonomic

চেষ্টা করে দেখুন

ব্যায়াম#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 ??? })
উত্তরের বিকল্প

রিক্যাপ

  • sort.Ints / sort.Strings / sort.Float64s বেস প্রকারের জন্য, ইন-প্লেস।
  • sort.Slice(s, less) যেকোনো ধরনের স্লাইসের জন্য, একটি less(i, j) ফাংশন সহ।
  • sort.SliceStable সমান কীগুলির জন্য আপেক্ষিক ক্রম সংরক্ষণ করতে।
  • একাধিক কী দ্বারা বাছাই করা: less এর ভিতরে if এর একটি ক্যাসকেড।
  • Go 1.21+: slices প্যাকেজ একটি জেনেরিক API সহ (slices.Sort, slices.SortFunc)।
  • মানচিত্র কীগুলির জন্য: একটি স্লাইস এবং বাছাই করুন।