【问题标题】:How to sort the versions in golang如何在golang中对版本进行排序
【发布时间】:2022-10-12 21:20:29
【问题描述】:

我有一个充满String 类型版本的数组,需要排序,但是当前的排序方法对它的排序不正确

apiVersions := []string{"1.4", "1.12", "1.21", "1.8"}

在对apiVersions 进行排序时,数组看起来像["1.12", "1.21", "1.4", "1.8"] 而不是["1.4", "1.8", "1.12", "1.21"]

【问题讨论】:

  • 你为什么不在. 字符处拆分字符串,将每个部分转换为整数并按数字排序,而不是按字母排序?
  • 排序算法不知道你的字符串的语义含义:排序算法不知道你的字符串保存版本以及如何对它们进行排序。排序算法只是按字节对字符串进行排序。您必须定义您的less() 函数,该函数告诉如何对存储为字符串的版本进行排序,并将其与sort.Slice() 一起使用。
  • 如果这些是语义版本,我建议只使用现有的库来解析和比较它们,这样你就不会错过任何其他版本组件,因为它们是稍后添加的。
  • 这回答了你的问题了吗? How to compare two version number strings in golang

标签: sorting go


【解决方案1】:

. 拆分后,您可以在第二部分尝试使用正确的填充

示例代码

    apiVersions := []string{"1.4", "1.12", "1.21", "1.8"}

    sort.Slice(apiVersions, func(i, j int) bool {
        spi := strings.Split(apiVersions[i], ".")
        spj := strings.Split(apiVersions[j], ".")
        if spi[0] > spj[0] {
            return true
        }

        // right padding
        spi[1] = fmt.Sprintf("%-04s", spi[1])
        spj[1] = fmt.Sprintf("%-04s", spj[1])
        if spi[1] > spj[1] {
            return false
        }

        return true
    })

    fmt.Println(apiVersions)

输出

[1.12 1.21 1.4 1.8]

【讨论】:

  • 您可能想使用"%04s"
【解决方案2】:

您可能应该使用标准的 Go 语义版本比较包之一来执行此操作,而不是重新发明轮子。对于初学者,使用hashicorp/go-version 包在语义上比较两个版本字符串

package main

import (
    "fmt"
    "sort"

    "github.com/hashicorp/go-version"
)

type byVersion []string

func (s byVersion) Len() int {
    return len(s)
}

func (s byVersion) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}

func (s byVersion) Less(i, j int) bool {
    v1, err := version.NewVersion(s[i])
    if err != nil {
        panic(err)
    }
    v2, err := version.NewVersion(s[j])
    if err != nil {
        panic(err)
    }
    return v1.LessThan(v2)
}

func main() {
    versions := []string{"1.4", "1.12", "1.21", "1.8"}
    sort.Sort(byVersion(versions))
    fmt.Println(versions)
}

产生预期的结果。

[1.4 1.8 1.12 1.21]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 2013-11-27
    • 2017-03-16
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多