Go語言中排序的3種實(shí)現(xiàn)方法
在寫代碼過程中,排序是經(jīng)常會遇到的需求,本文會介紹三種常用的方法。
廢話不多說,下面正文開始。
使用標(biāo)準(zhǔn)庫
根據(jù)場景直接使用標(biāo)準(zhǔn)庫中的方法,比如:
sort.Intssort.Float64ssort.Strings
舉個(gè)例子:
s?:=?[]int{4,?2,?3,?1}
sort.Ints(s)
fmt.Println(s)?//?[1?2?3?4]自定義比較器
使用 sort.Slice 方法排序時(shí),可以自定義比較函數(shù) less(i, j int) bool,這樣就可以根據(jù)需要按不同的字段進(jìn)行排序。
如果想要穩(wěn)定排序的話,就使用 sort.SliceStable 方法。
舉個(gè)例子:
family?:=?[]struct?{
????Name?string
????Age??int
}{
????{"Alice",?23},
????{"David",?2},
????{"Eve",?2},
????{"Bob",?25},
}
//?Sort?by?age,?keeping?original?order?or?equal?elements.
sort.SliceStable(family,?func(i,?j?int)?bool?{
????return?family[i].Age?<?family[j].Age
})
fmt.Println(family)?//?[{David?2}?{Eve?2}?{Alice?23}?{Bob?25}]自定義數(shù)據(jù)結(jié)構(gòu)
使用 sort.Sort 或者 sort.Stable 方法,它們可以對任意實(shí)現(xiàn)了 sort.Interface 的數(shù)據(jù)結(jié)構(gòu)排序。
type?Interface?interface?{
????//?Len?is?the?number?of?elements?in?the?collection.
????Len()?int
????//?Less?reports?whether?the?element?with
????//?index?i?should?sort?before?the?element?with?index?j.
????Less(i,?j?int)?bool
????//?Swap?swaps?the?elements?with?indexes?i?and?j.
????Swap(i,?j?int)
}意思就是說,只要某一個(gè)數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)了 Len() int,Less(i, j int) bool 和 Swap(i, j int) 這三個(gè)方法,那么就可以使用 sort.Sort 來排序。
舉個(gè)例子:
type?Person?struct?{
????Name?string
????Age??int
}
//?ByAge?implements?sort.Interface?based?on?the?Age?field.
type?ByAge?[]Person
func?(a?ByAge)?Len()?int???????????{?return?len(a)?}
func?(a?ByAge)?Less(i,?j?int)?bool?{?return?a[i].Age?<?a[j].Age?}
func?(a?ByAge)?Swap(i,?j?int)??????{?a[i],?a[j]?=?a[j],?a[i]?}
func?main()?{
????family?:=?[]Person{
????????{"Alice",?23},
????????{"Eve",?2},
????????{"Bob",?25},
????}
????sort.Sort(ByAge(family))
????fmt.Println(family)?//?[{Eve?2}?{Alice?23}?{Bob?25}]
}字典排序
我們都知道,字典是無序的,具體原因可以看之前寫的這篇文章 Go 語言 map 如何順序讀?。?/a>
如果想要字典按 key 或者 value 排序的話,可以這樣做。
m?:=?map[string]int{"Alice":?2,?"Cecil":?1,?"Bob":?3}
keys?:=?make([]string,?0,?len(m))
for?k?:=?range?m?{
????keys?=?append(keys,?k)
}
sort.Strings(keys)
for?_,?k?:=?range?keys?{
????fmt.Println(k,?m[k])
}
//?Output:
//?Alice?2
//?Bob?3
//?Cecil?1到此這篇關(guān)于Go語言中排序的3種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Go排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn)
這篇文章主要介紹了Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
淺談Golang?Slice切片如何擴(kuò)容的實(shí)現(xiàn)
本文主要介紹了淺談Golang?Slice切片如何擴(kuò)容的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Golang項(xiàng)目在github創(chuàng)建release后自動生成二進(jìn)制文件的方法
這篇文章主要介紹了Golang項(xiàng)目在github創(chuàng)建release后如何自動生成二進(jìn)制文件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換詳解
這篇文章主要為大家詳細(xì)介紹了Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01

