標籤:
一,縮緊排序
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語言程式設計》學習(六)