转: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`包来实现的。`sort`包提供了一系列的函数和接口,使得我们能够方便地对不同类型的切片进行排序。在本示例中,我们将关注如何使用`sort.Interface`接口自定义排序规则。 `sort....
为了能够支持多列排序,我们需要定义一个自定义类型的切片`IntArray`并实现`sort.Interface`接口中的三个方法:`Len`、`Swap`和`Less`。 - `Len()`返回数组的长度; - `Swap(i, j int)`用于交换索引为i和j的两个...
而在Go语言中,通过定义特定类型的接口实现排序操作变得更加简单和直观。 #### 基本类型排序 对于Golang中的基本类型(如int、float64和string),`sort`包提供了预定义的排序函数,可以直接对这些类型的数据进行...
在Golang中,插入排序可以有两种实现方式: 1. 新建切片: 在这种方式下,我们创建一个新的切片`newArr`,然后遍历原切片`arr`,将每个元素按顺序插入到`newArr`中。由于每次插入都需要移动元素,所以时间复杂度为...
实现sort接口即可用sort.Sort()方法对对象进行排序,而多重排序呢,我想传入不同排序规则,然后让该对象依次执行不同规则 // 排序规则 type lessFunc func(p1, p2 *CurriculumElem) bool // MultiSorter 多重排序...
2. `sort`包:提供排序算法,包括快速排序、归并排序等,可以对整型、浮点型、字符串甚至自定义类型进行排序。 四、错误处理 Go语言中,错误处理通常通过返回错误值实现。`errors`包提供了简单的错误创建和检查...
只要自定义类型实现了这个接口,就可以使用`sort.Sort()`函数进行排序。 例如,如果我们有一个自定义类型`Person`,表示一个人,包含姓名和年龄两个字段: ```go type Person struct { Name string Age int } ``...
`sort`包提供了`Sort`函数,可以对实现了`sort.Interface`接口的任何类型进行排序。这个接口包括三个方法:`Len`返回切片的长度,`Less`比较两个元素的顺序,`Swap`交换两个元素的位置。对于自定义类型,用户需要...
总的来说,Go语言中实现链表的关键在于理解和使用指针,以及利用空接口实现泛型的效果。通过以上步骤,我们可以构建一个基本的链表数据结构,用于存储和操作任意类型的数据。这对于理解和掌握Go语言的基础语法和特性...
- `sort`: 提供各种排序算法,如快速排序、插入排序等。 7. **错误处理** - `errors`: 提供基本的错误处理机制,包括创建和检查错误。 8. **文本处理** - `unicode`: 处理Unicode字符和字符串。 - `text/...
在`Golang-Assignment-Interfaces`中,可能会展示如何利用接口实现不同类型的排序。 最后,接口还用于实现接口之间的嵌套,这可以帮助我们构建更复杂的抽象。例如,可以定义一个`Writer`接口,表示可以写入数据的...
此外,Go语言提供了丰富的标准库,如`sort`包用于各种排序算法,`container/heap`包支持堆数据结构,`math`包包含数学函数等,这些都可以帮助我们在实现算法时减少重复工作,提高代码质量。 在压缩包文件"**c2go-...
`Go-go-testdeep`是一个强大的Golang库,它极大地扩展了标准库`testing`的功能,提供了更为灵活且全面的深度比较方法。这个库是为了解决在编写单元测试时,对于复杂数据结构(如嵌套的structs、arrays、maps等)进行...
假设我们要对读取的数据进行排序,可以先将数据转换为结构体,然后使用Golang的`sort`包对结构体切片进行排序。例如,如果我们有`TradeData`结构体: ```go type TradeData struct { Date string Value float64...