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

【go从零单排】sorting排序、Sorting by Functions排序方法

挪威特罗姆瑟夜景

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在 Go 语言中,排序通常使用 sort 包。这个包提供了对切片和用户自定义类型的排序功能。

💻代码

sorting排序

package main

//导入slices包,提供了对切片的操作函数,包括排序和检查排序状态
import (
	"fmt"
	"slices"
)

func main() {
	//创建字符串类型的切片strs并赋值
	strs := []string{"c", "a", "b"}
	//排序slice.Sort()
	slices.Sort(strs)
	fmt.Println("Strings:", strs)
	//创建一个int类型的切片并赋值
	ints := []int{7, 2, 4}
	//排序slice.Sort()
	slices.Sort(ints)
	fmt.Println("Ints:   ", ints)
	//	slices.IsSorted() 返回是否已排序,已排序true,未排序false
	s := slices.IsSorted(ints)
	fmt.Println("Sorted: ", s)
}

//输出
//Strings: [a b c]
//Ints:    [2 4 7]
//Sorted:  true

Sorting by Functions排序方法

package main

//导入cmp包用来比较值,导入slices操作切片
import (
	"cmp"
	"fmt"
	"slices"
)

func main() {
	//创建string类型的切片fruits
	fruits := []string{"peach", "banana", "kiwi"}
	//定义比较函数,输入两个string,输出一个int
	lenCmp := func(a, b string) int {
		//返回两个string的长度差
		return cmp.Compare(len(a), len(b))
	}
	//使用slices.SortFunc()排序,按照lenCmp排序
	slices.SortFunc(fruits, lenCmp)
	fmt.Println(fruits)
	//定义结构体Person
	type Person struct {
		name string
		age  int
	}
	//创建Person实例并赋值给people切片
	people := []Person{
		Person{name: "Jax", age: 37},
		Person{name: "TJ", age: 25},
		Person{name: "Alex", age: 72},
	}
	//对传入的people排序,按照age排序
	slices.SortFunc(people,
		func(a, b Person) int {
			//使用cmp.Compare比较两个Person对象的年龄
			return cmp.Compare(a.age, b.age)
		})
	fmt.Println(people)
}

//输出
//[kiwi peach banana]
//[{TJ 25} {Jax 37} {Alex 72}]

sort.Interface

package main

import (
    "fmt"
    "sort"
)

type Person struct {
    Name string
    Age  int
}

type ByAge []Person

func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

func main() {
    people := []Person{
        {"Alice", 30},
        {"Bob", 25},
        {"Charlie", 35},
    }

    sort.Sort(ByAge(people))
    fmt.Println(people) // 输出: [{Bob 25} {Alice 30} {Charlie 35}]
}

🔍理解

  • 对于基本类型(如整数、浮点数和字符串),可以直接使用 sort 包中的 Sort 函数。
  • 对自定义类型或根据特定条件进行排序,可以实现 sort.Interface 接口。这个接口包含三个方法:Len()、Less(i, j int) bool 和 Swap(i, j int)。
  • 使用 sort.Slice 可以更简洁地进行排序,无需定义新的类型。

💡 Tips小知识点

sort.Interface 接口

  • Len(): 返回集合的长度,用于确定排序的范围。
  • Less(i, j int) bool: 定义排序的顺序,返回 true 表示索引 i 的元素应该排在索引 j 的元素之前。
  • Swap(i, j int): 交换索引 i 和 j 的元素。
  • 必须实现三个方法,只实现了其中一个或两个方法,编译器会提示错误。

cmp.compare()

在 Go 语言中,cmp.Compare 是来自 google/go-cmp
包的一个方法,用于比较两个值。这个包提供了一个灵活的方式来比较结构体、切片和其他数据类型,特别是在单元测试中验证结构是否相等时非常有用

Example:

package main

import (
    "fmt"
    "github.com/google/go-cmp/cmp"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p1 := Person{"Alice", 30}
    p2 := Person{"Bob", 25}

    // 使用 cmp.Compare 比较两个结构体
    result := cmp.Compare(p1, p2)

    switch {
    case result < 0:
        fmt.Println("p1 is less than p2")
    case result > 0:
        fmt.Println("p1 is greater than p2")
    default:
        fmt.Println("p1 is equal to p2")
    }
}

用法:

cmp.Compare 函数接受两个参数,并返回一个整数值,表示这两个值的比较结果:

  • 返回 0 表示两个值相等。
  • 返回小于 0 的值表示第一个值小于第二个值。
  • 返回大于 0 的值表示第一个值大于第二个值。
  • cmp.Compare 适用于可以直接比较的类型。如果比较的类型不支持直接比较(例如,含有切片、映射或函数的结构体),则可能会导致运行时错误。

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述


http://www.kler.cn/a/390762.html

相关文章:

  • 用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转这些功能
  • Java之泛型--对象指定多个泛型类型(有示例)
  • Linux设置Nginx开机启动
  • Toeplitz矩阵循环矩阵
  • 【Python TensorFlow】进阶指南(续篇一)
  • C 语言标准库 - <errno.h>
  • DPI-MoCo:基于深度先验图像约束的运动补偿重建用于四维锥形束CT (4D CBCT)|文献速递-基于深度学习的病灶分割与数据超分辨率
  • Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin
  • 【LeetCode】【算法】5. 最长回文子串
  • docker——项目部署
  • LabVIEW车辆侧翻预警系统
  • 工位管理革新:Spring Boot企业级系统
  • SpringBoot沙箱环境支付宝支付
  • C# 阿里云短信接口调用(不使用SDK,单文件完成)
  • Spring Spring Boot 常用注解总结
  • 前端零基础学习Day-Eight
  • 使用 Java 将 byte[] 转换为 File 对象并上传到外部服务器
  • 【已解决】Postman:Get请求传JSON数据
  • Kafka面试题(三)
  • html的week控件 获取周(星期)的第一天(周一)和最后一天(周日)
  • Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法
  • scikit-learn学习Day30
  • Java基础08(类与对象)
  • Java字符串的处理
  • SSE (Server-Sent Events) 服务器实时推送详解
  • 力扣-Hot100-哈希【算法学习day.30】