当前位置: 首页 > news >正文

做公众号编辑用什么网站辽宁电力建设监理有限公司网站

做公众号编辑用什么网站,辽宁电力建设监理有限公司网站,腾讯云建网站,wordpress 评论双击排序操作和字符串格式化一样是很多程序经常使用的操作。尽管一个最短的快排程序只要15 行就可以搞定#xff0c;但是一个健壮的实现需要更多的代码#xff0c;并且我们不希望每次我们需要的时候 都重写或者拷贝这些代码。 幸运的是#xff0c;sort包内置的提供了根据一些排序…        排序操作和字符串格式化一样是很多程序经常使用的操作。尽管一个最短的快排程序只要15 行就可以搞定但是一个健壮的实现需要更多的代码并且我们不希望每次我们需要的时候 都重写或者拷贝这些代码。 幸运的是sort包内置的提供了根据一些排序函数来对任何序列排序的功能。它的设计非常独 到。在很多语言中排序算法都是和序列数据类型关联同时排序函数和具体类型元素关 联。相比之下Go语言的sort.Sort函数不会对具体的序列和它的元素做任何假设。相反它 使用了一个接口类型sort.Interface来指定通用的排序算法和可能被排序到的序列类型之间的约 定。这个接口的实现由序列的具体表示和它希望排序的元素决定序列的表示经常是一个切 片。 一个内置的排序算法需要知道三个东西序列的长度表示两个元素比较的结果一种交换 两个元素的方式这就是sort.Interface的三个方法 package sorttype Interface interface {Len() intLess(i, j int) bool // i, j are indices of sequence elementsSwap(i, j int) }为了对序列进行排序我们需要定义一个实现了这三个方法的类型然后对这个类型的一个 实例应用sort.Sort函数。思考对一个字符串切片进行排序这可能是最简单的例子了。下面是 这个新的类型StringSlice和它的LenLess和Swap方法 type StringSlice []string func (p StringSlice) Len() int { return len(p) } func (p StringSlice) Less(i, j int) bool { return p[i] p[j] } func (p StringSlice) Swap(i, j int) { p[i], p[j] p[j], p[i] } 现在我们可以通过像下面这样将一个切片转换为一个StringSlice类型来进行排序 sort.Sort(StringSlice(names)) 这个转换得到一个相同长度容量和基于names数组的切片值并且这个切片值的类型有 三个排序需要的方法。 对字符串切片的排序是很常用的需要所以sort包提供了StringSlice类型也提供了Strings函 数能让上面这些调用简化成sort.Strings(names)。 这里用到的技术很容易适用到其它排序序列中例如我们可以忽略大些或者含有特殊的字 符。本书使用Go程序对索引词和页码进行排序也用到了这个技术对罗马数字做了额外逻 辑处理。对于更复杂的排序我们使用相同的方法但是会用更复杂的数据结构和更复杂 地实现sort.Interface的方法。 我们会运行上面的例子来对一个表格中的音乐播放列表进行排序。每个track都是单独的一 行每一列都是这个track的属性像艺术家标题和运行时间。想象一个图形用户界面来呈 现这个表格并且点击一个属性的顶部会使这个列表按照这个属性进行排序再一次点击相 同属性的顶部会进行逆向排序。让我们看下每个点击会发生什么响应。 下面的变量tracks包好了一个播放列表。One of the authors apologizes for the other author’s musical tastes.每个元素都不是Track本身而是指向它的指针。尽管我们在下面的代 码中直接存储Tracks也可以工作sort函数会交换很多对元素所以如果每个元素都是指针会 更快而不是全部Track类型指针是一个机器字码长度而Track类型可能是八个或更多。 type Track struct {Title stringArtist stringAlbum stringYear intLength 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 } printTracks函数将播放列表打印成一个表格。一个图形化的展示可能会更好点但是这个小程 序使用text/tabwriter包来生成一个列是整齐对齐和隔开的表格像下面展示的这样。注意到 *tabwriter.Writer是满足io.Writer接口的。它会收集每一片写向它的数据它的Flush方法会格 式化整个表格并且将它写向os.Stdout标准输出。 func printTracks(tracks []*Track) {const format %v\t%v\t%v\t%v\t%v\t\ntw : 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 }为了能按照Artist字段对播放列表进行排序我们会像对StringSlice那样定义一个新的带有必 须LenLess和Swap方法的切片类型。 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] } 为了调用通用的排序程序我们必须先将tracks转换为新的byArtist类型它定义了具体的排 序 sort.Sort(byArtist(tracks)) 在按照artist对这个切片进行排序后printTrack的输出如下 Title Artist Album Year Length ----- ------ ----- ---- ------ Go Ahead Alicia Keys As I Am 2007 4m36s Go Delilah From the Roots Up 2012 3m38s Ready 2 Go Martin Solveig Smash 2011 4m24s Go Moby Moby 1992 3m37s 对于我们需要的每个切片元素类型和每个排序函数我们需要定义一个新的sort.Interface实 现。如你所见Len和Swap方法对于所有的切片类型都有相同的定义。下个例子具体的类 型customSort会将一个切片和函数结合使我们只需要写比较函数就可以定义一个新的排 Go语言圣经 sort.Interface接口 252 序。顺便说下实现了sort.Interface的具体类型不一定是切片类型customSort是一个结构体类型。 type customSort struct {t []*Trackless func(x, y *Track) bool } func (x customSort) Len() int 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] } 让我们定义一个多层的排序函数它主要的排序键是标题第二个键是年第三个键是运行 时间Length。下面是该排序的调用其中这个排序使用了匿名排序函数 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 }}) 这下面是排序的结果。注意到两个标题是“Go”的track按照标题排序是相同的顺序但是在按 照year排序上更久的那个track优先。 Title Artist Album Year Length ----- ------ ----- ---- ------ Go Moby Moby 1992 3m37s Go Delilah From the Roots Up 2012 3m38s Go Ahead Alicia Keys As I Am 2007 4m36s Ready 2 Go Martin Solveig Smash 2011 4m24s 尽管对长度为n的序列排序需要 O(n log n)次比较操作检查一个序列是否已经有序至少需要n −1次比较。sort包中的IsSorted函数帮我们做这样的检查。像sort.Sort一样它也使用 sort.Interface对这个序列和它的排序函数进行抽象但是它从不会调用Swap方法这段代码 示范了IntsAreSorted和Ints函数和IntSlice类型的使用 values : []int{3, 1, 4, 1} fmt.Println(sort.IntsAreSorted(values)) // false sort.Ints(values) fmt.Println(values) // [1 1 3 4] fmt.Println(sort.IntsAreSorted(values)) // true sort.Sort(sort.Reverse(sort.IntSlice(values))) fmt.Println(values) // [4 3 1 1] fmt.Println(sort.IntsAreSorted(values)) // false为了使用方便sort包为[]int,[]string和[]float64的正常排序提供了特定版本的函数和类型。对 于其他类型例如[]int64或者[]uint尽管路径也很简单还是依赖我们自己实现。
http://www.hkea.cn/news/14437806/

相关文章:

  • 怎么建网站app那种电影网站怎么建设
  • 依安县建设网站糕点网站设计
  • 律师行业做网站的必要性中轻成都设计院
  • 做纸箱在什么网站找客户域名申请好后 如何建设网站
  • 市桥网站建设培训哪里建设网站
  • 正规代加工项目提供邢台网站优化
  • 一般网站有哪些模块做视频付费网站
  • 贸易公司广告网站东圃手机网站建设电话
  • 东营seo网站推广费用英文网站seo
  • 织梦网站添加视频教程垂直+网站开发
  • 怎么做简单网站国外云服务器厂商
  • 做网站是什么会计科目义乌 网站制作
  • 响应式网站建设服务商商城开发方案
  • 做网站还是做游戏公司做的网站访问很慢
  • 网站建设get你有哪些可以在线做app的网站有哪些问题
  • 论坛的网站制作做电商必备的八个软件
  • 网站关键词排名优化价格网络广告策划
  • 网站建设准备资料表格pyhton可以做网站吗
  • 潍坊网站制作人才招聘临沂经开区建设局网站
  • 可以找网图的软件长沙网站seo技术厂家
  • 精通网站建设 100%全能建站密码pdf常德做网站报价
  • 想开一个网站开发的公司wordpress编辑空两格
  • 主视觉设计网站ppt软件下载免费版
  • 国内免费图片素材网站快手直播间挂人气自助网站
  • 方便做流程图的网站做房产网站哪个好
  • 网站建设售后回访话术物流企业网站织梦模板
  • 郑州定制网站推广工具产品北京 网站设计公司
  • 网站稳定性网络推广网站推广方法
  • 企业网站建设规划设计任务书跨境平台哪个最好做?
  • 做外贸的网站开店流程开源阅读app