Go 排序代码悬赏
本站的 Go 下载 一直有个让站长很不爽的地方,就是版本的排序有问题。加上太忙也静不下心来搞。
顺带活跃下气氛,就搞一次悬赏活动吧。
要求:
输入一个版本字符串 slice,返回排序的 slice。
func VersionSort(versions []string) []string {
}
下面是例子:
[]string {"1.6beta1", "1.5rc1", "1.5beta2", "1.5beta1", "1.5.1", "1.5", "1.4rc2", "1.4rc1", "1.4beta1", "1.4.2", "1.4.1", "1.4", "1.3rc2", "1.3rc1", "1.3beta2", "1.3beta1", "1.3.3", "1.3.2", "1.3.1", "1.3", "1.2rc5", "1.2rc4", "1.2rc3", "1.2rc2", "1.2rc1", "1.2.2", "1.2.1", "1.2", "1.1.2", "1.1.1", "1.1", "1.0.3", "1.0.2", "1.5.2", "1.5alpha1"}
要求返回:
[]string {"1.0.2", "1.0.3", "1.1", "1.1.1", "1.1.2", "1.2rc1", "1.2rc2", "1.2rc3", "1.2rc4", "1.2rc5", "1.2", "1.2.1", "1.2.2", "1.3beta1", "1.3beta2", "1.3rc1", "1.3rc2", "1.3", "1.3.1", "1.3.2", "1.3.3", "1.4beta1", "1.4rc1", "1.4rc2", "1.4", "1.4.1", "1.4.2", "1.5alpha1", "1.5beta1", "1.5beta2", "1.5rc1", "1.5", "1.5.1", "1.5.2", "1.6beta1"}
奖金模式
奖品为200元购书金额,请获奖者将图书目录列给我,我直接从网上购买快递。
奖金分配方式
独享,选取最早提交且满足要求的方案。如果有晚提交的用户的方案也满足要求,且实现优雅,会再提供100元购物金额奖励。
代码版权
最终满足方案的代码将用于 Golang 中国的代码中。
方案提交方式
在该主题回复即可,注意格式化代码。
共 46 个回复
jihua0a
为何不给每个版本附加上发布时间,以发布时间排序不是最简单吗?
jimmykuu
@jihua0a ,我原先是用配置文件做的,每次都要维护一个配置文件,工作量比较大。
现在干脆直接用最简单的方式处理,用文件夹按版本存储,而且这个排序方法也可以通用。
版本排序确实是个需求,Python 就有个 natsort。
stevewang
liutp
leedstyh
我也来个,不是程序猿,太复杂的做法不会。
fantasyxky
Idea:
Demo can be found here.
Output is
iamcc
golang_learn
zxh
Comdex
我也来一个!
Comdex
九楼的这样也行
Comdex
做了一个可能并不准确的测试,在32位机器,win7系统下跑楼上的代码测试运行所需要的时间
测试的主要代码为:
得出的结果如下:
1楼:673.0385ms
4楼:31.0017ms
5楼:26.0015ms
6楼:451.0258ms
7楼:22.0012ms
8楼:16.001ms
9楼:10.0006ms
10楼:7.0004ms
哈哈,测试结果仅供参考
snake117
baiyuxiong
推荐9楼,简单清晰。
直接用sort.Strings排序会因为数字比字母小,导致部分排序有问题,用~去掉这个影响。
snake117
@baiyuxiong
不行的,现在是版本号里的数字都是单个的,所以可以;如果是多个数字的话(没人保证go不会出现这种版本号,也没人说这个函数只用在go的版本号上)就会出问题了。
jimmykuu
最终我会做些边界检查,比如出现 10.0.1这种版本号,目前对于我这边的需求来说,这些方案都够用了,但是通用的还要经过测试。
golang_learn
xiaoxiaoyijan
gleport
有个 go-version 包:
JessonChan
9楼明显更加geek,但是不够优雅,9楼的代码也可以按这个思路来改下。
dicom
beego
这个帖子最热 O(∩_∩)O哈!
dududu
这样的活动请多举办一些!
damao
感觉关键还是看版本号的命名规则,比如符合semver的就有现成的semver,不过重在参与我也来个,跟楼上不太一样的是考虑多一点点,比如单个数字“28”(LiteIDE),可以任意添加字符版本如“preview”,在我自己的测试中添加有“10alpha1”,“1.0preview”,“2”,“28”等字串。
peterrk
好吧,我实际上是个C党…
miraclesu
我也撸了一个 natsort,测试了上面一些同学的代码,有些同学好像没有考虑字符串后面的数字大小这种情况:
wangzhikk
来个高端大气上档次的, 比10楼更快
wx163
没怎么写过golang, 不对的地方, 请指正
David
Just for fun:
guange
hongkangzy
这么火啊
wangkechun
来个python版本的
jimmykuu
春节后公布结果哈。
hil2000
学习了!
qgymje
Unknown
楼主需要这个:https://github.com/mcuadros/go-version
guantou
有点看不下去了,php一个 asort 搞定, golang却要一大堆代码。不是挑事,但php做得确实太贴心。
damao
@guantou 我也有点看不下去了,你仔细看看你的输出是不是符合要求先
wuqingtao
我也来一个
liuferi
可能会出现1.10 么?
lvhao0419
提供一种思路吧..
ThoseFlowers
@liuferi 可能。这里的点(“.”)不是小数点,而是分隔符。第一个后面的数表示副版本号,它有可能是两位数。
xingfe123
为什么大家这么喜欢替换呢,直接比较不好吗?@lvhao0419,@wuqingtao
reganee
感觉使用递归更好解决
每次以
.
为分隔符lmw
xd42