如何根据数值对切片进行排序,如果数值等于则按字母顺序排序

时间:2017-09-22 09:43:17

标签: sorting go slice

我有切片如下

{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
}

2 个答案:

答案 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)

}

导入“反映”