MSp*_*Dev 4 sorting arraylist go slice
我见过用其他几种语言提出这个问题,每种语言都有很好的答案。IE
如何按行长度对文件进行排序,然后按字母顺序对第二个键进行排序?
我无法在 Golang 中弄清楚:/假设我有这个列表:
2 22 2H 2J 2J2 2J3 2J322422 2J322423 2J33 2M 2P 2W 2X
Run Code Online (Sandbox Code Playgroud)
我希望排序后的输出为:
2 22 2H 2J 2M 2P 2W 2X 2J2 2J3 2J33 2J322422 2J322423
Run Code Online (Sandbox Code Playgroud)
我在 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)
Run Code Online (Sandbox Code Playgroud)
如果排序两次,第二次排序将不考虑第一次排序的规则。
您必须排序一次,并且排序规则必须包含您要作为排序依据的所有属性。
所以首先你想按长度排序。如果两个元素具有相同的长度,则按自然顺序排列。您可以通过首先检查函数中的长度来实现这一点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)
Run Code Online (Sandbox Code Playgroud)
这将输出(在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]
Run Code Online (Sandbox Code Playgroud)
您可以扩展此逻辑以按任意数量的属性(或规则)进行排序。首先检查优先级较高的规则,如果它们定义了顺序差异,则返回它们指定的顺序(第ith元素是否小于jth的信息)。如果它们不区分相关元素的位置,您将继续使用较低优先级的规则。