`

golang排序实现 sort接口实现

 
阅读更多

转:http://www.dotcoo.com/golang-sort

今天看见群里再讨论排序的sort.Interface的实现,有童鞋一直搞不定,我就上手了一下,哦耶搞定了,代码放在这里.

其实很简单sort.Interface借口有三个方法,给自己的struct实现这三个方法,然后用将自己的结构体传给sort.Sort方法就排序完成.

当然sort包也有几个常用的方法sort.Float64Slice sort.IntSlise sort.StringSlise,呵呵

package main
                 
import (
    "fmt"
    "sort"
)
                 
type MapSorter []Item
                 
type Item struct {
    Key string
    Val int64
}
                 
func NewMapSorter(m map[string]int64) MapSorter {
    ms := make(MapSorter, 0, len(m))
                 
    for k, v := range m {
        ms = append(ms, Item{k, v})
    }
                 
    return ms
}
                 
func (ms MapSorter) Len() int {
    return len(ms)
}
                 
func (ms MapSorter) Less(i, j int) bool {
    return ms[i].Val < ms[j].Val // 按值排序
    //return ms[i].Key < ms[j].Key // 按键排序
}
                 
func (ms MapSorter) Swap(i, j int) {
    ms[i], ms[j] = ms[j], ms[i]
}
                 
func main(){
    m  := map[string]int64 {
        "e": 10,
        "a": 2,
        "d": 15,
        "c": 8,
        "f": 1,
        "b": 12,
    }
                 
    ms := NewMapSorter(m)
    sort.Sort(ms)
                 
    for _, item := range ms {
        fmt.Printf("%s:%d\n", item.Key, item.Val)
    }
}

下面实现一个简单的计算区间覆盖长度的问题
    m  := map[float64]float64 {
        1.0: 2.0,
        5.1: 6.5,
        2.3: 3.1,
        4.3: 4.8,
        4.4: 4.5,
        9.5: 12.0,
    }
    ms := NewMapSorter(m)
    sort.Sort(ms)
    e,t := 0.0, 0.0
    for _, item := range ms {
        if item.Key <= e && item.Val > e {
            t = t + item.Val - e
        } else if e < item.Key {
            t = t + item.Val - item.Key
        }
        if item.Val > e {
            e = item.Val
        }
        fmt.Printf("%v,%v\n",e,t)
        fmt.Printf("%v:%v\n", item.Key, item.Val)
    }
    fmt.Printf("%v\n", t)
分享到:
评论

相关推荐

    golang使用sort接口实现排序示例

    在Golang中,排序操作是通过`sort`包来实现的。`sort`包提供了一系列的函数和接口,使得我们能够方便地对不同类型的切片进行排序。在本示例中,我们将关注如何使用`sort.Interface`接口自定义排序规则。 `sort....

    Golang算法问题之数组按指定规则排序的方法分析

    为了能够支持多列排序,我们需要定义一个自定义类型的切片`IntArray`并实现`sort.Interface`接口中的三个方法:`Len`、`Swap`和`Less`。 - `Len()`返回数组的长度; - `Swap(i, j int)`用于交换索引为i和j的两个...

    深入理解golang的基本类型排序与slice排序

    而在Go语言中,通过定义特定类型的接口实现排序操作变得更加简单和直观。 #### 基本类型排序 对于Golang中的基本类型(如int、float64和string),`sort`包提供了预定义的排序函数,可以直接对这些类型的数据进行...

    Golang 实现插入排序的方法示例(2种)

    在Golang中,插入排序可以有两种实现方式: 1. 新建切片: 在这种方式下,我们创建一个新的切片`newArr`,然后遍历原切片`arr`,将每个元素按顺序插入到`newArr`中。由于每次插入都需要移动元素,所以时间复杂度为...

    go 多重排序 堆排序

    实现sort接口即可用sort.Sort()方法对对象进行排序,而多重排序呢,我想传入不同排序规则,然后让该对象依次执行不同规则 // 排序规则 type lessFunc func(p1, p2 *CurriculumElem) bool // MultiSorter 多重排序...

    Golang1.3官方标准包帮助(汉化)

    2. `sort`包:提供排序算法,包括快速排序、归并排序等,可以对整型、浮点型、字符串甚至自定义类型进行排序。 四、错误处理 Go语言中,错误处理通常通过返回错误值实现。`errors`包提供了简单的错误创建和检查...

    golang对自定义类型进行排序的解决方法

    只要自定义类型实现了这个接口,就可以使用`sort.Sort()`函数进行排序。 例如,如果我们有一个自定义类型`Person`,表示一个人,包含姓名和年龄两个字段: ```go type Person struct { Name string Age int } ``...

    开源项目-golang-go.zip

    `sort`包提供了`Sort`函数,可以对实现了`sort.Interface`接口的任何类型进行排序。这个接口包括三个方法:`Len`返回切片的长度,`Less`比较两个元素的顺序,`Swap`交换两个元素的位置。对于自定义类型,用户需要...

    Golang中List的实现方法示例详解

    总的来说,Go语言中实现链表的关键在于理解和使用指针,以及利用空接口实现泛型的效果。通过以上步骤,我们可以构建一个基本的链表数据结构,用于存储和操作任意类型的数据。这对于理解和掌握Go语言的基础语法和特性...

    golang标准库api文档

    - `sort`: 提供各种排序算法,如快速排序、插入排序等。 7. **错误处理** - `errors`: 提供基本的错误处理机制,包括创建和检查错误。 8. **文本处理** - `unicode`: 处理Unicode字符和字符串。 - `text/...

    Golang-Assignment-Interfaces:显示接口示例的分配

    在`Golang-Assignment-Interfaces`中,可能会展示如何利用接口实现不同类型的排序。 最后,接口还用于实现接口之间的嵌套,这可以帮助我们构建更复杂的抽象。例如,可以定义一个`Writer`接口,表示可以写入数据的...

    go实现《c语言经典算法》中的100个例子.zip

    此外,Go语言提供了丰富的标准库,如`sort`包用于各种排序算法,`container/heap`包支持堆数据结构,`math`包包含数学函数等,这些都可以帮助我们在实现算法时减少重复工作,提高代码质量。 在压缩包文件"**c2go-...

    Go-go-testdeep极其灵活的golang深度比较扩展了go测试包

    `Go-go-testdeep`是一个强大的Golang库,它极大地扩展了标准库`testing`的功能,提供了更为灵活且全面的深度比较方法。这个库是为了解决在编写单元测试时,对于复杂数据结构(如嵌套的structs、arrays、maps等)进行...

    godealwithexcel.zip

    假设我们要对读取的数据进行排序,可以先将数据转换为结构体,然后使用Golang的`sort`包对结构体切片进行排序。例如,如果我们有`TradeData`结构体: ```go type TradeData struct { Date string Value float64...

Global site tag (gtag.js) - Google Analytics