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

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)

icz*_*cza 6

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

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

所以首先你想按长度排序。如果两个元素具有相同的长度,则按自然顺序排列。您可以通过首先检查函数中的长度来实现这一点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的信息)。如果它们不区分相关元素的位置,您将继续使用较低优先级的规则。