3 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
另一種選擇是編寫(xiě)函數(shù),返回與參數(shù)簽名匹配的切片上的閉包:lesssort.Slice
func ascX0DescX1(s []MySuperType) (func(int, int) bool) {
return func(i, j int) bool {
if s[i].x0 == s[j].x0 {
return s[i].x1 > s[j].x1
}
return s[i].x0 < s[j].x0
}
}
然后將其作為lessarg傳遞給sort.Slice:
sort.Slice(mySuperSlice, ascX0DescX1(mySuperSlice))

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
為每個(gè)排序編寫(xiě)一個(gè)排序函數(shù),并根據(jù)需要從 f1、f2 和 f3 調(diào)用:
func sortByX0AscX1Desc(s []MySuperType) {
sort.Slice(s, func(i, j int) bool {
switch {
case s[i].x0 < s[j].x0:
return true
case s[i].x0 > s[j].x0:
return false
case s[i].x1 > s[j].x1:
return true
default:
return false
}
})
}
func f1(mySuperSlice []MySuperType) {
sortByX0AscX1Desc(mySuperSlice)
// do something with the sorted list
}
func f2(mySuperSlice []MySuperType) {
sortBySomethingElse(mySuperSlice)
// do something with the sorted list
}
func f3(mySuperSlice []MySuperType) {
sortByX0AscX1Desc(mySuperSlice)
// do something with the sorted list
}

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
您也可以省略額外的功能并在需要的地方調(diào)用排序。
type MySuperType struct {
x0, x1, x2, x3 string
}
func f1() {
fields := []MySuperType {
{ "a1", "b4", "c3", "d2" },
{ "a2", "b1", "c2", "d3" },
{ "a3", "b1", "c4", "d1" },
{ "a4", "b3", "c1", "d4" },
}
sort.SliceStable(fields, func(i, j int) bool {
return fields[i].x1 < fields[j].x1 || fields[i].x2 > fields[j].x2
})
fmt.Println("by x1, then x2: ", fields)
}
結(jié)果:通過(guò) x1,然后 x2:[{a3 b1 c4 d1} {a2 b1 c2 d3} {a4 b3 c1 d4} {a1 b4 c3 d2}]
- 3 回答
- 0 關(guān)注
- 179 瀏覽
添加回答
舉報(bào)