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

我无法在 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)


慕神8447489
浏览 87回答 2
2回答

蛊毒传说

如果你排序两次,第二次排序不会考虑第一次排序的规则。您必须排序一次,并且排序规则必须包含您要排序的所有属性。所以主要你想按长度排序。如果 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 {&nbsp; &nbsp; l1, l2 := len(list[i]), len(list[j])&nbsp; &nbsp; if l1 != l2 {&nbsp; &nbsp; &nbsp; &nbsp; return l1 < l2&nbsp; &nbsp; }&nbsp; &nbsp; 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的信息)。如果它们不区分相关元素的位置,则继续使用较低优先级的规则。

侃侃无极

您需要一个比较器函数,该函数可以根据您定义的排序规则进行正确比较。要对一段字符串进行排序,首先按长度,然后按字母顺序,您应该这样做:strs := []string{&nbsp; "Zulu"&nbsp; &nbsp; , "Yankee" , "X-Ray"&nbsp; , "Whiskey" , "Victor" ,&nbsp; "Ulysses" , "Tango"&nbsp; , "Sierra" , "Romeo"&nbsp; &nbsp;, "Quebec" ,&nbsp; "Poppa"&nbsp; &nbsp;,"Oscar"&nbsp; &nbsp;, "Nancy"&nbsp; , "Mike"&nbsp; &nbsp; , "Lima"&nbsp; &nbsp;,&nbsp; "Kilo"&nbsp; &nbsp; , "Juliet" , "India"&nbsp; , "Hotel"&nbsp; &nbsp;, "Golf"&nbsp; &nbsp;,&nbsp; "Foxtrot" , "Echo"&nbsp; &nbsp;, "Delta"&nbsp; , "Charlie" , "Bravo"&nbsp; ,&nbsp; "Alpha"&nbsp; &nbsp;,&nbsp; }&nbsp; byLengthThenAlphabetically := func(i int, j int) bool {&nbsp; &nbsp; x := strs[i]&nbsp; &nbsp; y := strs[j]&nbsp; &nbsp; deltaLength := len(x) - len(y)&nbsp; &nbsp; return deltaLength < 0 || (deltaLength == 0 && x < y)&nbsp; }&nbsp;&nbsp;&nbsp; sort.Slice(strs, byLengthThenAlphabetically )在https://play.golang.org/p/nL2bTDlWM49的 Go Playground 中尝试一下
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go