本文目錄一覽:
golang標準庫之sort
標準庫sort實現了4種排序方法, 插入排序 、 堆排序 、 快排 和 歸併排序 ,但是並沒有暴露給用戶介面。sort包會根據數據選擇最優的排序方法(其實只使用了3種, 歸併排序 除外)。
用戶需要實現以下介面才能使用sort包的排序功能。
對於常用的類型( 整型切片 、 float64切片 、 String切片 ),sort包提供了內置的介面實現
使用舉例如下:
舉例如下:
golang 實現選擇排序演算法
選擇排序提高了冒泡排序的性能,它每遍歷一次列表只交換一次數據,即進行一次遍歷時找 到最大的項,完成遍歷後,再把它換到正確的位置。和冒泡排序一樣,第一次遍歷後,最大的數 據項就已歸位,第二次遍歷使次大項歸位。這個過程持續進行,一共需要 n-1 次遍歷來排好 n 個數 據,因為最後一個數據必須在第 n-1 次遍歷之後才能歸位。
golang排序問題求助
如果是只有這幾個的話 我們可以考慮自定義一個排序類型
func TestSort(t *testing.T) {
data := []string{“三級”, “一級”, “二級”}
rule := map[string]int{
“一級”: 1,
“二級”: 2,
“三級”: 3,
}
self := SelfSort{
Rule: rule,
Data: data,
}
sort.Sort(self)
fmt.Println(self.Data)
}
type SelfSort struct {
Rule map[string]int
Data []string
}
func (p SelfSort) Len() int { return len(p.Data) }
func (p SelfSort) Less(i, j int) bool { return p.Rule[p.Data[i]] p.Rule[p.Data[j]] }
func (p SelfSort) Swap(i, j int) { p.Data[i], p.Data[j] = p.Data[j], p.Data[i] }
如過很多 就是真的要比較中文的話, 就用這種
package mainimport ( “bytes”
“fmt”
“io/ioutil”
“sort”
“golang.org/x/text/encoding/simplifiedchinese”
“golang.org/x/text/transform”)//ByPinyin is customized sort interface to sort string by Chinese PinYintype ByPinyin []stringfunc (s ByPinyin) Len() int { return len(s) }func (s ByPinyin) Swap(i, j int) { s[i], s[j] = s[j], s[i] }func (s ByPinyin) Less(i, j int) bool {
a, _ := UTF82GBK(s[i])
b, _ := UTF82GBK(s[j])
bLen := len(b) for idx, chr := range a { if idx bLen-1 { return false
} if chr != b[idx] { return chr b[idx]
}
} return true}//UTF82GBK : transform UTF8 rune into GBK byte arrayfunc UTF82GBK(src string) ([]byte, error) {
GB18030 := simplifiedchinese.All[0] return ioutil.ReadAll(transform.NewReader(bytes.NewReader([]byte(src)), GB18030.NewEncoder()))
}//GBK2UTF8 : transform GBK byte array into UTF8 stringfunc GBK2UTF8(src []byte) (string, error) {
GB18030 := simplifiedchinese.All[0]
bytes, err := ioutil.ReadAll(transform.NewReader(bytes.NewReader(src), GB18030.NewDecoder())) return string(bytes), err
}func main() {
b := []string{“哈”, “呼”, “嚯”, “ha”, “,”}
sort.Strings(b) //output: [, ha 呼 哈 嚯]
fmt.Println(“Default sort: “, b)
sort.Sort(ByPinyin(b)) //output: [, ha 哈 呼 嚯]
fmt.Println(“By Pinyin sort: “, b)
}
copy from 網頁鏈接
Golang 中數組(Array)和切片(Slice)的區別
Go 中數組的長度是不可改變的,而 Slice 解決的就是對不定長數組的需求。他們的區別主要有兩點。
數組:
切片:
注意 1
雖然數組在初始化時也可以不指定長度,但 Go 語言會根據數組中元素個數自動設置數組長度,並且不可改變。切片通過 append 方法增加元素:
如果將 append 用在數組上,你將會收到報錯:first argument to append must be slice。
注意 2
切片不只有長度(len)的概念,同時還有容量(cap)的概念。因此切片其實還有一個指定長度和容量的初始化方式:
這就初始化了一個長度為3,容量為5的切片。
此外,切片還可以從一個數組中初始化(可應用於如何將數組轉換成切片):
上述例子通過數組 a 初始化了一個切片 s。
當切片和數組作為參數在函數(func)中傳遞時,數組傳遞的是值,而切片傳遞的是指針。因此當傳入的切片在函數中被改變時,函數外的切片也會同時改變。相同的情況,函數外的數組則不會發生任何變化。
原創文章,作者:WEPRX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/318113.html