Sorting by Functions

Sorting by Functions #

// တစ်ခါတလေ အက္ခရာစဉ် နံပါတ်စဉ် စသည် သဘာဝအစဉ်အလိုက် သာမက
// အခြားပုံစံမျိုးဖြင့် စဉ်ခြင်းမျိုးကိုလည်း ဆောင်ရွက်လိုပါလိမ့်မည်။ နမူနာအားဖြင့်
// ဆိုရသော် အက္ခရာစဉ်ခြင်းမျိုးမဟုတ်ပဲ အက္ခရာအလုံးအရေအတွက်အားဖြင့်
// စဉ်လိုသည်ဟု ယူဆပါစို့။ Go တွင် မိမိစဉ်လိုသည့် ပုံစံများကို အောက်ပါ
// နမူနာတွင် ကြည့်နိုင်သည်။

package main

import (
	"fmt"
	"sort"
)

// Go မှာ custom function သုံးပြီး sort လုပ်မယ်ဆိုရင် အဲဒါနဲ့
// ကိုက်တဲ့ data type တစ်ခုလိုတယ်။ ဒီမှာ `byLength` လို့ခေါ်တဲ့ custom type တစ်ခု
// ဖန်တီးထားတယ်။​ အဲဒါက တကယ်တော့ `[]string` ကို နာမည်ပြောင်းခေါ်တာမျိုး ဖြစ်တယ်။
// `[]string` ဆိုတဲ့ type ကို `byLength` ဆိုတဲ့ type အနေနဲ့ သုံးမယ်ဆိုတာမျိုး။
type byLength []string

// အပေါ်မှာ ဖန်တီးထားတဲ့ type အတွက် `sort.Interface` ရေးပေးဖို့လိုတယ်။
// `Len`, `Less`၊ နဲ့ `Swap` လို့ခေါ်တဲ့ `Interface` ၃ ခု။ အဲဒီဟာတွေ ရေးပေးထားမှ
// `sort` package ထဲမှာရှိတဲ့ generic `Sort` function ကို သုံးလို့ရမှာ။ array လိုမျိုး
// type တွေအတွက်`Len` နဲ့ `Swap` အတွက် ရေးပေးရတဲ့ကုဒ်က ဆင်တူလေ့ရှိတယ်။ sort လုပ်တဲ့
// logic ရှိတဲ့နေရာက `Less` interface ပဲ။​ အဲဒီမှာ sorting logic ကို သွားရေး
// ပေးထားရတယ်။ အခုကိစ္စမှာဆို string တိုးတာပဲဖြစ်ဖြစ် လျော့တာပဲဖြစ်ဖြစ်
// string length ကိုသုံးပြီး sort လုပ်ပေးပါဆိုပြီး ခိုင်းတာမျိုး။ အဲ့လို sort ဖြစ်ဖို့
// `len(s[i])` နဲ့ `len(s[j])` တွေကို `Less` interface မှာ သုံးထားတယ်။
func (s byLength) Len() int {
	return len(s)
}
func (s byLength) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
	return len(s[i]) < len(s[j])
}

// လိုအပ်သည့် ကုဒ်များကို နေရာတကျ ရေးပြီးသည့်အခါ မူလ `fruits` slice ကို
// `byLength` အမျိုးအစားသို့ ပြောင်းလဲလိုက်ခြင်းအားဖြင့် မိမိစဉ်လိုသည့် လောဂျစ်ကို
// အကောင်အထည် ဖော်နိုင်သွားသည်။ ထို့နောက် ၎င်း `byLength` ကို စဉ်ရန်
// `sort.Sort` အသုံးပြုသည်။
func main() {
	fruits := []string{"peach", "banana", "kiwi"}
	sort.Sort(byLength(fruits))
	fmt.Println(fruits)
}
# ပရိုဂရမ်ကို ခိုင်းစေလိုက်ပါက
# မိမိဖြစ်စေချင်သည့်
# အက္ခရာအလုံးအရေအတွက်ဖြင့်
# စဉ်ထားသော list ကို
# ပြသပါမည်။
$ go run sorting-by-functions.go
[kiwi peach banana]

# စိတ်ကြိုက် ဒေတာအမျိုးအစားကို ဖန်တီးခြင်း၊
# ၎င်းအမျိုးအစားအတွက် `Interface` method
# သုံးခုကို တည်ဆောက်ခြင်း၊
# ၎င်းအမျိုးအစားကို အသုံးပြုထားသော collection
# တွင် sort.Sort အသုံးပြုပြီး စဉ်ခြင်း
# စသည့် ယခုလို ပုံစံမျိုးကို နမူနာယူပြီး
# Go slice များကို စိတ်ကြိုက် function
# များဖြင့် စဉ်နိုင်သည်။