【问题标题】:Sort string array by line length AND alphabetically at once按行长和字母顺序对字符串数组进行排序
【发布时间】:2021-12-19 02:13:27
【问题描述】:

我见过用其他几种语言提出的这个问题,每种语言都有很好的答案。即

How to sort a file by line length and then alphabetically for the second key?

how to sort by length of string followed by alphabetical order?

Sort strings alphabetically AND by length?

我在 Golang 中无法弄清楚:/ 假设我有这个列表:

2 22 2H 2J 2J2 2J3 2J322422 2J322423 2J33 2M 2P 2W 2X

我希望排序后的输出是:

2 22 2H 2J 2M 2P 2W 2X 2J2 2J3 2J33 2J322422 2J322423

我在 Golang 中尝试了一些东西,但无法正常工作。

// Log
t.Log.Println(values)

// Sort values alphabetically
sort.Strings(values)

// Sort values by length
sort.Slice(values, func(i, j int) bool {
    return len(values[i]) < len(values[j])
})

// Log
t.Log.Println(values)

【问题讨论】:

    标签: sorting go arraylist slice


    【解决方案1】:

    如果你排序两次,第二次排序不会考虑第一次排序的规则。

    您必须排序一次,并且排序规则必须包含您要排序的所有属性。

    所以主要是你想按长度排序。如果 2 个元素具有相同的长度,则按自然顺序。您可以通过首先检查less() 函数中的长度来实现这一点。如果它们不相等,则按长度排序决定结果。如果他们是平等的,你就会诉诸自然秩序。

    list := strings.Split("2 22 2H 2J 2J2 2J3 2J322422 2J322423 2J33 2M 2P 2W 2X", " ")
    fmt.Println(list)
    
    sort.Slice(list, func(i, j int) bool {
        l1, l2 := len(list[i]), len(list[j])
        if l1 != l2 {
            return l1 < l2
        }
        return list[i] < list[j]
    })
    fmt.Println(list)
    

    这将输出(在Go Playground 上尝试):

    [2 22 2H 2J 2J2 2J3 2J322422 2J322423 2J33 2M 2P 2W 2X]
    [2 22 2H 2J 2M 2P 2W 2X 2J2 2J3 2J33 2J322422 2J322423]
    

    您可以扩展此逻辑以按任意数量的属性(或规则)进行排序。你先检查优先级高的规则,如果它们定义了顺序不同,你就返回它们指定的顺序(ith元素是否小于j元素的信息th)。如果它们不区分相关元素的位置,则继续使用优先级较低的规则。

    【讨论】:

    • 这太棒了,谢谢。帮助我了解排序包如何更好地工作?
    【解决方案2】:

    您需要一个比较器函数,该函数可以根据您定义的排序规则进行正确比较。

    要对一段字符串进行排序,首先按长度,然后按字母顺序,您应该这样做:

    strs := []string{
      "Zulu"    , "Yankee" , "X-Ray"  , "Whiskey" , "Victor" ,
      "Ulysses" , "Tango"  , "Sierra" , "Romeo"   , "Quebec" ,
      "Poppa"   ,"Oscar"   , "Nancy"  , "Mike"    , "Lima"   ,
      "Kilo"    , "Juliet" , "India"  , "Hotel"   , "Golf"   ,
      "Foxtrot" , "Echo"   , "Delta"  , "Charlie" , "Bravo"  ,
      "Alpha"   ,
      }
    
      byLengthThenAlphabetically := func(i int, j int) bool {
        x := strs[i]
        y := strs[j]
        deltaLength := len(x) - len(y)
    
        return deltaLength < 0 || (deltaLength == 0 && x < y)
      }
      
      sort.Slice(strs, byLengthThenAlphabetically )
    
    

    在 https://play.golang.org/p/nL2bTDlWM49 的 Go Playground 中尝试一下

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      相关资源
      最近更新 更多