[记录]结构体排序

go 接口学习

package main

import(
	"fmt"
	"time"
	"sort"
	"text/tabwriter"
	"os"
	"flag"
)

type Track struct{
	Title,Artist,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")},
	{"I got smoke", "V is Burning", "LTDZ", 2022, length("3m32s")},
}

func length(s string)time.Duration{
	d, err := time.ParseDuration(s)
	if err != nil{
		panic(s)
	}
	return d
}

func PrintTracks(track []*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 track{
		fmt.Fprintf(tw, format, t.Title, t.Artist, t.Album, t.Year, t.Length)
	}
	tw.Flush()
}

type trackSorter struct{
	tracks []*Track
	by func(t1, t2 *Track)bool
}

func(s *trackSorter)Len()int{return len(s.tracks)}
func(s *trackSorter)Swap(i, j int){s.tracks[i], s.tracks[j] = s.tracks[j], s.tracks[i]}
func(s *trackSorter)Less(i, j int)bool{return s.by(s.tracks[i], s.tracks[j])}

func sortBy(t []*Track, by func(t1, t2 *Track)bool, reverseFlag bool){
	sorter := &trackSorter{
		tracks : t,
		by : by,
	}
	if !reverseFlag{
		sort.Sort(sorter)
	}else{
		sort.Sort(sort.Reverse(sorter))
	}
}

func byYear(t1, t2 *Track)bool{
	return t1.Year < t2.Year
}
func byArtist(t1, t2 *Track)bool{
	return t1.Artist < t2.Artist
}
func byAlbum(t1, t2 *Track)bool{
	return t1.Album < t2.Album
}
func byLength(t1, t2 *Track)bool{
	return t1.Length < t2.Length
}
func byTitle(t1, t2 *Track)bool{
	return t1.Title < t2.Title
}

func main(){
	var yearFlag = flag.Bool("year", false, "sort tracks by year")
	var artistFlag = flag.Bool("artist", false, "sort tracks by artist")
	var albumFlag = flag.Bool("album", false, "sort tracks by album")
	var titleFlag = flag.Bool("title", false, "sort tracks by title")
	var lengthFlag = flag.Bool("length", false, "sort tracks by length")
	var reverseFlag = flag.Bool("r", false, "sort reverse")
	flag.Parse()
	if *yearFlag{
		sortBy(tracks, byYear, *reverseFlag)
	}else if *artistFlag{
		sortBy(tracks, byArtist, *reverseFlag)
	}else if *albumFlag{
		sortBy(tracks, byAlbum, *reverseFlag)
	}else if *titleFlag{
		sortBy(tracks, byTitle, *reverseFlag)
	}else if *lengthFlag{
		sortBy(tracks, byLength, *reverseFlag)
	}else{
		fmt.Println("use -h for help")
		return
	}
	PrintTracks(tracks)
}
  1. flag库解析命令行指令
  2. 定义trackSorter,包含track和一个比较函数
  3. 定义Len,Swap,Less(sort定义的3个接口)
  4. 根据flag解析的来填入trackSorter的by函数
  5. 调用sort.Sort进行排序,使用其接口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值