Go語言中排序的3種實現(xiàn)方法
在寫代碼過程中,排序是經常會遇到的需求,本文會介紹三種常用的方法。
廢話不多說,下面正文開始。
使用標準庫
根據(jù)場景直接使用標準庫中的方法,比如:
sort.Ints
sort.Float64s
sort.Strings
舉個例子:
s?:=?[]int{4,?2,?3,?1} sort.Ints(s) fmt.Println(s)?//?[1?2?3?4]
自定義比較器
使用 sort.Slice
方法排序時,可以自定義比較函數(shù) less(i, j int) bool
,這樣就可以根據(jù)需要按不同的字段進行排序。
如果想要穩(wěn)定排序的話,就使用 sort.SliceStable
方法。
舉個例子:
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ù)結構
使用 sort.Sort
或者 sort.Stable
方法,它們可以對任意實現(xiàn)了 sort.Interface
的數(shù)據(jù)結構排序。
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) }
意思就是說,只要某一個數(shù)據(jù)結構實現(xiàn)了 Len() int
,Less(i, j int) bool
和 Swap(i, j int)
這三個方法,那么就可以使用 sort.Sort
來排序。
舉個例子:
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 如何順序讀取?
如果想要字典按 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
到此這篇關于Go語言中排序的3種實現(xiàn)方法的文章就介紹到這了,更多相關Go排序內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言集成mysql驅動、調用數(shù)據(jù)庫、查詢數(shù)據(jù)操作示例
這篇文章主要介紹了Go語言集成mysql驅動、調用數(shù)據(jù)庫、查詢數(shù)據(jù)操作,結合實例形式分析了Go語言安裝mysql驅動包、連接mysql數(shù)據(jù)庫及查詢等相關操作技巧,需要的朋友可以參考下2019-06-06Go Sentinel 動態(tài)數(shù)據(jù)源配置指南(示例詳解)
本文介紹了如何使用Go語言配置Sentinel的動態(tài)數(shù)據(jù)源,并通過本地文件和Nacos兩種方式實現(xiàn)動態(tài)配置,通過這種方式,可以靈活地管理和更新限流規(guī)則,提升系統(tǒng)的穩(wěn)定性和響應速度,感興趣的朋友跟隨小編一起看看吧2025-01-01Golang?使用os?庫的?ReadFile()?讀文件最佳實踐
這篇文章主要介紹了Golang使用os庫的ReadFile()讀文件最佳實踐,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09