1package list 2 3import ( 4 "sort" 5) 6 7type Item interface { 8 Len() int 9} 10 11type Column struct { 12 total int 13 sorted bool 14 lengths sort.IntSlice 15} 16 17func (c *Column) sort() { 18 if !c.sorted { 19 c.lengths.Sort() 20 c.sorted = true 21 } 22} 23 24func (c *Column) Add(item string) { 25 ln := len(item) 26 c.lengths = append(c.lengths, ln) 27 c.total += len(item) 28 c.sorted = false 29} 30 31func (c *Column) Avg() int { 32 if c.lengths.Len() == 0 { 33 return 0 34 } 35 return c.total / c.lengths.Len() 36} 37 38func (c *Column) Max() int { 39 if len(c.lengths) == 0 { 40 return 0 41 } 42 c.sort() 43 return c.lengths[len(c.lengths)-1] 44} 45 46func (c *Column) Median() int { 47 c.sort() 48 ln := c.lengths.Len() 49 mid := ln / 2 50 if ln == 0 { 51 return 0 52 } else if ln%2 == 1 { 53 return c.lengths[mid] 54 } 55 return (c.lengths[mid-1] + c.lengths[mid]) / 2 56} 57 58func (c *Column) Remove(item string) { 59 idx := c.lengths.Search(len(item)) 60 if idx >= c.lengths.Len() { 61 return 62 } else if idx == c.lengths.Len()-1 { 63 c.lengths = c.lengths[:idx] 64 } else { 65 c.lengths = append(c.lengths[:idx], c.lengths[idx+1:]...) 66 } 67 c.total -= len(item) 68 c.sorted = false 69} 70 71func (c *Column) Set(items []string) { 72 c.lengths = make(sort.IntSlice, len(items)) 73 c.sorted = false 74 c.total = 0 75 76 for i, item := range items { 77 ln := len(item) 78 c.lengths[i] = ln 79 c.total += c.lengths[i] 80 } 81 82 c.sort() 83} 84