From 7a8e1a2a6d3458ffd1a6703368c9521e2558cafc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8B=AC=E5=AD=A4=E4=BC=B6=E4=BF=9C?= <1184662350@qq.com> Date: Sat, 17 Dec 2022 12:31:14 +0800 Subject: [PATCH] =?UTF-8?q?day9=E6=8E=A5=E5=8F=A3=20=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/study/day9Interface/SortInterface.go | 112 +++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/study/day9Interface/SortInterface.go diff --git a/src/study/day9Interface/SortInterface.go b/src/study/day9Interface/SortInterface.go new file mode 100644 index 0000000..fb209b5 --- /dev/null +++ b/src/study/day9Interface/SortInterface.go @@ -0,0 +1,112 @@ +package main + +import ( + "fmt" + "os" + "sort" + "text/tabwriter" + "time" +) + +type Interface interface { + // Len 方法返回集合中的元素个数 + Len() int + // Less 方法报告索引i的元素是否比索引j的元素小 + Less(i, j int) bool + // Swap 方法交换索引i和j的两个元素 + Swap(i, j int) +} + +// StringSlice 结构体实现了Interface接口 +type StringSlice []string + +// Len 方法返回集合中的元素个数 +func (p StringSlice) Len() int { return len(p) } + +// Less 方法报告索引i的元素是否比索引j的元素小 +func (p StringSlice) Less(i, j int) bool { return p[i] < p[j] } + +// Swap 交换元素 +func (p StringSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Track struct { + Title string + Artist string + Album string + Year int + Length time.Duration +} + +var tracks = []*Track{ + {"Go", "Delilah", "From the Roots Up", 2012, length("3m38s")}, + {"Go", "Moby", "Moby", 1992, length("3m37s")}, + {"Go Ahead", "Alicia Keys", "As I Am", 2007, length("4m36s")}, + {"Ready 2 Go", "Martin Solveig", "Smash", 2011, length("4m24s")}, +} + +func length(s string) time.Duration { + d, err := time.ParseDuration(s) + if err != nil { + panic(s) + } + return d +} +func printTracks(tracks []*Track) { + const format = "%v\t%v\t%v\t%v\t%v\t\n" + tw := new(tabwriter.Writer).Init(os.Stdout, 0, 8, 2, ' ', 0) + fmt.Fprintf(tw, format, "Title", "Artist", "Album", "Year", "Length") + fmt.Fprintf(tw, format, "-----", "------", "-----", "----", "------") + for _, t := range tracks { + fmt.Fprintf(tw, format, t.Title, t.Artist, t.Album, t.Year, t.Length) + } + tw.Flush() // calculate column widths and print table +} + +type byArtist []*Track + +func (x byArtist) Len() int { return len(x) } +func (x byArtist) Less(i, j int) bool { return x[i].Artist < x[j].Artist } +func (x byArtist) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +type byYear []*Track + +func (x byYear) Len() int { return len(x) } +func (x byYear) Less(i, j int) bool { return x[i].Year < x[j].Year } +func (x byYear) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +type customSort struct { + t []*Track + less func(x, y *Track) bool +} + +func (x customSort) Len() int { return len(x.t) } +func (x customSort) Less(i, j int) bool { return x.less(x.t[i], x.t[j]) } +func (x customSort) Swap(i, j int) { x.t[i], x.t[j] = x.t[j], x.t[i] } + +func main() { + nums := StringSlice([]string{"b", "f", "c", "a"}) + sort.Sort(nums) + fmt.Println(nums) + + printTracks(tracks) + fmt.Println() + sort.Sort(byArtist(tracks)) + printTracks(tracks) + fmt.Println() + sort.Sort(sort.Reverse(byArtist(tracks))) + printTracks(tracks) + + sort.Sort(customSort{tracks, func(x, y *Track) bool { + if x.Title != y.Title { + return x.Title < y.Title + } + if x.Year != y.Year { + return x.Year < y.Year + } + if x.Length != y.Length { + return x.Length < y.Length + } + return false + }}) + +}