zoukankan      html  css  js  c++  java
  • go实例之排序

    1、默认排序

      使用sort包进行排序。排序是就地排序,因此它会更改给定的切片,并且不返回新的切片。

     1 package main
     2 
     3 import "fmt"
     4 import "sort"
     5 
     6 func main() {
     7 
     8     // Sort methods are specific to the builtin type;
     9     // here's an example for strings. Note that sorting is
    10     // in-place, so it changes the given slice and doesn't
    11     // return a new one.
    12     strs := []string{"c", "a", "b"}
    13     sort.Strings(strs)
    14     fmt.Println("Strings:", strs)
    15 
    16     // An example of sorting `int`s.
    17     ints := []int{7, 2, 4}
    18     sort.Ints(ints)
    19     fmt.Println("Ints:   ", ints)
    20 
    21     // We can also use `sort` to check if a slice is
    22     // already in sorted order.
    23     s := sort.IntsAreSorted(ints)
    24     fmt.Println("Sorted: ", s)
    25 }

      执行上面代码,将得到以下输出结果

    1 Strings: [a b c]
    2 Ints:    [2 4 7]
    3 Sorted:  true

      从上述代码可知,排序不同类型切片,调用不同接口,排序时直接对参数进行修改,排序接口不对排序后切片进行返回。

    2、自定义排序

      自定义排序需要我们声明一个相应类型,并实现sort.Interface-Len,Less,Swap在这个类型上,Less接口是正真的排序方法,Swap用于交换两个值,Len用于求出切片大小。如下示例代码,首先将原始 fruits 切片转换为ByLength来实现自定义排序,然后对该类型切片使用sort.Sort()方法。

    图1 sort.Interface定义

      其实自定义排序就是对接口的使用。针对ByLength结构重写了sort.Interface接口的方法。如图1所示,是在LiteIDE中sort.Interface的提示

     1 package main
     2 
     3 import "sort"
     4 import "fmt"
     5 
     6 // In order to sort by a custom function in Go, we need a
     7 // corresponding type. Here we've created a `ByLength`
     8 // type that is just an alias for the builtin `[]string`
     9 // type.
    10 type ByLength []string
    11 
    12 // We implement `sort.Interface` - `Len`, `Less`, and
    13 // `Swap` - on our type so we can use the `sort` package's
    14 // generic `Sort` function. `Len` and `Swap`
    15 // will usually be similar across types and `Less` will
    16 // hold the actual custom sorting logic. In our case we
    17 // want to sort in order of increasing string length, so
    18 // we use `len(s[i])` and `len(s[j])` here.
    19 func (s ByLength) Len() int {
    20     return len(s)
    21 }
    22 func (s ByLength) Swap(i, j int) {
    23     s[i], s[j] = s[j], s[i]
    24 }
    25 func (s ByLength) Less(i, j int) bool {
    26     return len(s[i]) < len(s[j])
    27 }
    28 
    29 // With all of this in place, we can now implement our
    30 // custom sort by casting the original `fruits` slice to
    31 // `ByLength`, and then use `sort.Sort` on that typed
    32 // slice.
    33 func main() {
    34     fruits := []string{"peach", "banana", "kiwi"}
    35     sort.Sort(ByLength(fruits))
    36     fmt.Println(fruits)
    37 }

      执行上面代码,将得到以下输出结果

    1 [kiwi peach banana]
  • 相关阅读:
    vs2015 打开xaml:右击-打开方式->xml编辑器
    交互式计算机图形学(基于webGL)资源使用
    利用pushState开发无刷页面切换
    js 阻止冒泡 stopPropagation
    PHP中“简单工厂模式”实例讲解
    ajax传递特殊字符串问题 +%@
    GitHub自学
    ajax 请求超时 取消请求
    mongo操作之分页
    我使用过的Linux命令之date
  • 原文地址:https://www.cnblogs.com/swarmbees/p/6601615.html
Copyright © 2011-2022 走看看