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的信息)。如果它们不区分相关元素的位置,则继续使用较低优先级的规则。
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 中尝试一下
- 2 回答
- 0 关注
- 86 浏览
添加回答
举报