【问题标题】:How to sort slice according to the numeric value and if numeric value equals then sort by alphabetical order如何根据数值对切片进行排序,如果数值等于则按字母顺序排序
【发布时间】:2018-03-03 20:24:30
【问题描述】:

我有如下切片

{string, int }

[{zaa 1} {aab 1} {xac 1}]

在这种情况下 int side equal 所以不需要按字母顺序排序

如果我的切片如下所示

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

【问题讨论】:

    标签: sorting go slice


    【解决方案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}]
    

    【讨论】:

      【解决方案2】:
      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)
      
      }
      

      导入“反射”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 2021-12-20
        相关资源
        最近更新 更多