2015-05-09 73 views
2

我正在閱讀一個目錄,並且我注意到如果我有按數字排序的文件(1,2,3,4 ...),那麼它似乎使用一些字母順序。假設我有13個文件(名爲1.md,2.md,3.md ...),排序如下:1,10,11,12,13,2,3,4。 ..;我使用產生這一順序與當前的代碼是:在Go中按數字順序對文件進行排序

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的整數。

謝謝。

回答

8

您能否根據您的要求實施sort界面和訂單?鑑於返回的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()) 
} 

我知道它不是很簡潔,但是是一個有效的答案。

+1

我發佈我的問題後不久有這個想法;我以不同的方式寫了它 - 但非常感謝您的幫助。我已經接受了你的回答,因爲如果我使用了它,它會給我我想要的。 – q3d

+1

@BenCampbell,您在上次修改時添加了語法錯誤。 –

+0

@DaveC謝謝!現場編寫代碼總是有風險的。 –

相關問題