《go語言程式設計》學習(六)

來源:互聯網
上載者:User

標籤:

一,縮緊排序

package mainimport (    "fmt"    "sort"    "strings")var original = []string{    "Nonmentals",    "    Hydrogen",    "    Carbon",    "    Nitrogenl",    "    Oxygen",    "Inner Transitionals",    "    Lanthanides",    "        Europium",    "        Cerium",    "    Actinides",    "        Uranium",    "        Plutonium",    "        Curium",    "Alkali Metals",    "    Lithium",    "    Sodium",    "    Potassium",}func main() {    fmt.Println("|        Original        |        Sorted        |")    fmt.Println("|----------------------|-------------------|")    sorted := SortedIndentedStrings(original)    for i := range original {        fmt.Printf("|%-19s|%-19s|\n", original[i], sorted[i])    }}func SortedIndentedStrings(slice []string) []string {    entries := populatedEntries(slice)    return sortedEntries(entries)}func populatedEntries(slice []string) Entries {    indent, IndentSize := computeIndent(slice)    fmt.Printf("[%s] %d = %d\n", indent, len(indent), IndentSize)    entries := make(Entries, 0)    for _, item := range slice {        i, level := 0, 0        for strings.HasPrefix(item[i:], indent) {            i += IndentSize            level++        }        key := strings.ToLower(strings.TrimSpace(item))        addEntry(level, key, item, &entries)    }    return entries}func computeIndent(slice []string) (string, int) {    for _, item := range slice {        if len(item) > 0 && (item[0] == ‘ ‘ || item[0] == ‘\t‘) {            whitspace := rune(item[0])            for i, char := range item[1:] {                if char != whitspace {                    i++                    return strings.Repeat(string(whitspace), i), i                }            }        }    }    return "", 0}func addEntry(level int, key, value string, entries *Entries) {    if level == 0 {        *entries = append(*entries, Entry{key, value, make(Entries, 0)})    } else {        addEntry(level-1, key, value,            &((*entries)[entries.Len()-1].children))    }}func sortedEntries(entries Entries) []string {    var indentedSlice []string    sort.Sort(entries)    for _, entry := range entries {        populatedIndentedStrings(entry, &indentedSlice)    }    return indentedSlice}func populatedIndentedStrings(entry Entry, indentedSlice *[]string) {    *indentedSlice = append(*indentedSlice, entry.value)    sort.Sort(entry.children)    for _, child := range entry.children {        populatedIndentedStrings(child, indentedSlice)    }}type Entry struct {    key      string    value    string    children Entries}type Entries []Entryfunc (entries Entries) Len() int { return len(entries) }func (entries Entries) Less(i, j int) bool {    return entries[i].key < entries[j].key}func (entries Entries) Swap(i, j int) {    entries[i], entries[j] = entries[j], entries[i]}

這個代碼,還是很簡單,不過還不算很完美,因為有一個假定的前提——所有文本行都使用相同的縮緊。

代碼邏輯:

首先遍曆所有行資料,直到找到一行,是用空格活著tab開頭的文字,並擷取這行有多少個該字元,以此作為判定縮緊等級的基礎。

然後再次便利所有行資料,用string.hasPrefix擷取反覆對字串“開頭”進行計算,計算結果即縮緊等級。

使用縮緊等級構造資料結構Entry,縮緊為0,則新增根Entrie,縮緊為1,則在根Entry的child上,構建改Entry,為2,則在Entry的child的child上構建。

最後使用定義的Less方法做字串的比較,對每個根的每一層Entry分別進行sort。

使用的資料結構,如果假設有一個叫root的Entry節點,就可以認為是一棵樹啦。

 

《go語言程式設計》學習(六)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.