为了账号安全,请及时绑定邮箱和手机立即绑定

按行长和字母顺序对字符串数组进行排序

按行长和字母顺序对字符串数组进行排序

Go
慕神8447489 2022-10-10 19:14:02
我无法在 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 中尝试了一些东西,但无法让它工作。// Logt.Log.Println(values)// Sort values alphabeticallysort.Strings(values)// Sort values by lengthsort.Slice(values, func(i, j int) bool {    return len(values[i]) < len(values[j])})// Logt.Log.Println(values)
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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


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


所以主要你想按长度排序。如果 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]

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


查看完整回答
反对 回复 2022-10-10
?
侃侃无极

TA贡献2051条经验 获得超10个赞

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


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


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 中尝试一下


查看完整回答
反对 回复 2022-10-10
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信