我正在阅读目录,并注意到这个目录,如果我有按数字(1、2、3、4 ...)排序的文件,则似乎使用了一些字母顺序。
假设我有13个文件(分别命名为1.md,2.md,3.md ...),则顺序如下:1,10,11,12,12,13,2,3,4 ...; 我用来生成此订单的当前代码是:
files, _ := ioutil.ReadDir(my_dir)
for _, f := range files {
fmt.Println(f.Name())
}
我要查找的顺序是1、2、3,... 9、10、11、12、13。
如何对这些文件进行严格的数字排序?请记住,每个文件都被命名为N.md,其中N被保证为大于或等于0的整数。
谢谢。
您可以根据需要实现排序界面和排序吗?给定返回的os.FileInfo元素的切片,您可以使用数字顺序而不是字典顺序来排列它们。
type ByNumericalFilename []os.FileInfo
func (nf ByNumericalFilename) Len() int { return len(nf) }
func (nf ByNumericalFilename) Swap(i, j int) { nf[i], nf[j] = nf[j], nf[i] }
func (nf ByNumericalFilename) Less(i, j int) bool {
// Use path names
pathA := nf[i].Name()
pathB := nf[j].Name()
// Grab integer value of each filename by parsing the string and slicing off
// the extension
a, err1 := strconv.ParseInt(pathA[0:strings.LastIndex(pathA, ".")], 10, 64)
b, err2 := strconv.ParseInt(pathB[0:strings.LastIndex(pathB, ".")], 10, 64)
// If any were not numbers sort lexographically
if err1 != nil || err2 != nil {
return pathA < pathB
}
// Which integer is smaller?
return a < b
}
files, _ := ioutil.ReadDir(".")
sort.Sort(ByNumericalFilename(files))
for _, f := range files {
fmt.Println(f.Name())
}
我知道它不是很简洁,但是是一个有效的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句