我有切片如下
{string, int }
[{zaa 1} {aab 1} {xac 1}]
在这种情况下int side相等所以我不需要使用字母顺序排序
如果我的切片像下面那样
[{zaa 1} {aab 4} {xac 2}]
我需要使用数值排序,我该怎么做?
现在我正在使用golang提供的排序
type ByStringValue []string
type ByNumericValue []WeightBaseResourceInfo
func (a ByStringValue) Len() int { return len(a) }
func (a ByStringValue) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByStringValue) Less(i, j int) bool { return a[i] < a[j] }
func (a ByNumericValue) Len() int { return len(a) }
func (a ByNumericValue) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByNumericValue) Less(i, j int) bool {
w1 := a[i].Weight
w2 := a[j].Weight
return w1 > w2
}
答案 0 :(得分:1)
对于排序切片,只需使用在Go 1.8中添加的sort.Slice()
。
要使用sort.Slice()
,您只需要提供一个比较器函数,该函数必须判断一个元素是否小于另一个元素。
less()
函数中的逻辑应首先测试数字,如果它们不同,则数字应决定结果。如果它们相等,则比较文本值以判断一个是否小于另一个。
例如:
type Entry struct {
Text string
Number int
}
func main() {
es := []Entry{
{"zaa", 1}, {"aab", 1}, {"xac", 1},
{"zaa", 1}, {"aab", 4}, {"xac", 2},
}
sort.Slice(es, func(i, j int) bool {
if a, b := es[i].Number, es[j].Number; a != b {
return a < b
}
return es[i].Text < es[j].Text
})
fmt.Println(es)
}
输出(在Go Playground上尝试):
[{aab 1} {xac 1} {zaa 1} {zaa 1} {xac 2} {aab 4}]
答案 1 :(得分:0)
type ByName []WeightBaseResourceInfo
func (a ByName) Len() int { return len(a) }
func (a ByName) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByName) Less(i, j int) bool { return a[i].ResourceId < a[j].ResourceId }
func main() {
resourceWeightInfo := make([]WeightBaseResourceInfo, 3)
start := make([]WeightBaseResourceInfo, 3)
var tempWeightInfo WeightBaseResourceInfo
tempWeightInfo.ResourceId = "zaa"
tempWeightInfo.Weight = 2
resourceWeightInfo[0] = tempWeightInfo
tempWeightInfo.ResourceId = "aab"
tempWeightInfo.Weight = 5
resourceWeightInfo[1] = tempWeightInfo
tempWeightInfo.ResourceId = "xac"
tempWeightInfo.Weight = 1
resourceWeightInfo[2] = tempWeightInfo
copy(start,resourceWeightInfo)
fmt.Println("start", start)
sort.Sort(ByNumericValue(resourceWeightInfo))
if(reflect.DeepEqual(start,resourceWeightInfo)){
sort.Sort(ByName(resourceWeightInfo))
}
fmt.Println("Sorted", resourceWeightInfo)
}
导入“反映”