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

Go 语言中排序的 3 种方法

原文链接: Go 语言中排序的 3 种方法

在写代码过程中,排序是经常会遇到的需求,本文会介绍三种常用的方法。

废话不多说,下面正文开始。

使用标准库

根据场景直接使用标准库中的方法,比如:

  • sort.Ints
  • sort.Float64s
  • sort.Strings

举个例子:

s := []int{4, 2, 3, 1}
sort.Ints(s)
fmt.Println(s) // [1 2 3 4]

自定义比较器

使用 sort.Slice 方法排序时,可以自定义比较函数 less(i, j int) bool,这样就可以根据需要按不同的字段进行排序。

如果想要稳定排序的话,就使用 sort.SliceStable 方法。

举个例子:

family := []struct {Name stringAge  int
}{{"Alice", 23},{"David", 2},{"Eve", 2},{"Bob", 25},
}// Sort by age, keeping original order or equal elements.
sort.SliceStable(family, func(i, j int) bool {return family[i].Age < family[j].Age
})
fmt.Println(family) // [{David 2} {Eve 2} {Alice 23} {Bob 25}]

自定义数据结构

使用 sort.Sort 或者 sort.Stable 方法,它们可以对任意实现了 sort.Interface 的数据结构排序。

type Interface interface {// Len is the number of elements in the collection.Len() int// Less reports whether the element with// index i should sort before the element with index j.Less(i, j int) bool// Swap swaps the elements with indexes i and j.Swap(i, j int)
}

意思就是说,只要某一个数据结构实现了 Len() intLess(i, j int) boolSwap(i, j int) 这三个方法,那么就可以使用 sort.Sort 来排序。

举个例子:

type Person struct {Name stringAge  int
}// ByAge implements sort.Interface based on the Age field.
type ByAge []Personfunc (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() {family := []Person{{"Alice", 23},{"Eve", 2},{"Bob", 25},}sort.Sort(ByAge(family))fmt.Println(family) // [{Eve 2} {Alice 23} {Bob 25}]
}

字典排序

我们都知道,字典是无序的,具体原因可以看之前写的这篇文章 Go 语言 map 如何顺序读取?

如果想要字典按 key 或者 value 排序的话,可以这样做。

m := map[string]int{"Alice": 2, "Cecil": 1, "Bob": 3}keys := make([]string, 0, len(m))
for k := range m {keys = append(keys, k)
}
sort.Strings(keys)for _, k := range keys {fmt.Println(k, m[k])
}
// Output:
// Alice 2
// Bob 3
// Cecil 1

以上就是本文的全部内容,如果觉得还不错的话欢迎点赞转发关注,感谢支持。


参考文章:

  • https://yourbasic.org/golang/how-to-sort-in-go/#performance-and-implementation

推荐阅读:

  • Go 语言 map 是并发安全的吗?
  • Go 语言切片是如何扩容的?
  • Go 语言数组和切片的区别
  • Go 语言 new 和 make 关键字的区别
  • 为什么 Go 不支持 []T 转换为 []interface
  • 为什么 Go 语言 struct 要使用 tags

相关文章:

Go 语言中排序的 3 种方法

原文链接&#xff1a; Go 语言中排序的 3 种方法 在写代码过程中&#xff0c;排序是经常会遇到的需求&#xff0c;本文会介绍三种常用的方法。 废话不多说&#xff0c;下面正文开始。 使用标准库 根据场景直接使用标准库中的方法&#xff0c;比如&#xff1a; sort.Intsso…...

12----Emoji表情

本节我们主要讲解markdown的Emoji 在 Markdown 里使用 Emoji 表情有两种方法:一种是直接输入 Emoji 表情&#xff0c;另一种是使用 Emoji 表情短码(emoji shartcodes)。 一、打印方式&#xff1a; 直接输入 Emoji 表情&#xff1a;在 Markdown 中&#xff0c;可以直接输入 Em…...

C++四种强制类型转换

一、C强制转换与C强制转换 c语言强制类型转换主要用于基础的数据类型间的转换&#xff0c;语法为&#xff1a; (type-id)expression//转换格式1 type-id(expression)//转换格式2c除了能使用c语言的强制类型转换外&#xff0c;还新增了四种强制类型转换&#xff1a;static_cas…...

git仓库新建上传记录

新建git仓会出现版本分支问题&#xff0c;解决过程&#xff1a; 其他的前期绑定之类的传送&#xff1a;https://blog.csdn.net/qq_37194189/article/details/130767397 大概思路&#xff1a;新建一个分支&#xff0c;上传&#xff0c;合并&#xff0c;删除分支 git branch …...

flutter调用so

lutter是一种基于Dart语言的跨平台开发框架&#xff0c;通常用于开发Android和iOS应用程序。如果您想要在Flutter应用程序中调用一个SO库&#xff0c;您可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;将您的SO库文件复制到Flutter项目的“lib”目录下。 接下来&…...

c#依赖注入

依赖注入(Dependency Injection,简称 DI)是一种设计模式,用于将对象的创建和管理责任从使用它的类中分离出来,从而实现松耦合和易于测试的代码。在 C# 中,依赖注入通常通过以下方式实现: 构造函数注入(Constructor Injection): 这是最常见的依赖注入方式,通过类的构…...

Django框架使用定时器-APScheduler实现定时任务:django实现简单的定时任务

一、系统环境依赖 系统&#xff1a;windows10 python: python3.9.0 djnago3.2.0 APScheduler3.10.1 二、django项目配置 1、创建utils包&#xff0c;在包里面创建schedulers包 utils/schedulers/task.py #1、设置 Django 环境&#xff0c;就可以导入项目的模型类这些了 …...

Go学习笔记之数据类型

文章目录 GO数据类型数组array切片slice集合map结构体make和new GO数据类型 在go语言中&#xff0c;定义的全局数据结构不使用不会报错&#xff0c;定义的局部数据结构必须使用&#xff0c;否则报错&#xff1b;建议定义的数据类型就要使用&#xff0c;要么不定义。 数组array …...

Spring Cloud 微服务

前言 Spring Cloud 中的所有子项目都依赖Spring Boot框架&#xff0c;所以Spring Boot 框架的版本号和Spring CLoud的版本号之间也存在以来及兼容关系。 Spring Cloud生态下的服务治理的解决方案主要有两个&#xff1a; Spring Cloud Netfix 和 Spring Cloud Alibaba。这两个…...

SpringBoot属性配置

SpringBoot提供了多种属性配置方式 application.properties server.port80 application.yml server:port: 81application.yaml server:port: 82SpringBoot配置文件加载顺序 application.properties > application.yml > application.yaml常用配置文件种类 application.…...

算法通关村第十关 | 归并排序

1. 归并排序原理 归并排序&#xff08;MERARE-SORT&#xff09;简单来说就是将大的序列先视为若干个比较小的数组&#xff0c;分成比较小的结构&#xff0c;然后是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分就是将问题分成一些小的问题分…...

SpringBoot3集成Kafka

标签&#xff1a;Kafka3.Kafka-eagle3&#xff1b; 一、简介 Kafka是一个开源的分布式事件流平台&#xff0c;常被用于高性能数据管道、流分析、数据集成和关键任务应用&#xff0c;基于Zookeeper协调的处理平台&#xff0c;也是一种消息系统&#xff0c;具有更好的吞吐量、内…...

css学习1

1、样式定义如何显示元素。 2、样式通常保存至外部的css文件中。 3、样式可以使内容与表现分离。 4、css主要有两部分组成&#xff1a;选择器与一条或多条声明。 选择器通常为要改变的html元素&#xff0c;每条声明由一个属性和一个值组成。每个属性有一个值&#xff0c;属性…...

rust踩雷笔记(1)——切片传参和解引用赋值

最近学习rust&#xff0c;网上资料还是很有限&#xff0c;做题遇到的问题&#xff0c;有时需要自己试验。把自己做题过程遇到的问题&#xff0c;和试验的结论&#xff0c;做一些简单记录。 阅读下列文字和代码 用切片&#xff08;的引用&#xff09;做参数要非常小心&#xff…...

安全 1自测

常见对称加密算法&#xff1a; DES&#xff08;Data Encryption Standard&#xff09;&#xff1a;数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合&#xff1b; 3DES&#xff08;Triple DES&#xff09;&#xff1a;是基于DES&#xff0c;对一块数据用…...

寻路算法小游戏

寻路算法小demo 寻路算法有两种&#xff0c;一种是dfs 深度优先算法&#xff0c;一种是 dfs 深度优先算法 深度优先搜索的步骤分为 1.递归下去 2.回溯上来。顾名思义&#xff0c;深度优先&#xff0c;则是以深度为准则&#xff0c;先一条路走到底&#xff0c;直到达到目标。这…...

CSS基础 知识点总结

一.CSS简介 1.1 CSS简介 ① CSS指的是层叠样式表&#xff0c;用来控制网页外观的一门技术 ② CSS发展至今&#xff0c;经历过CSS1.0 CSS2.0 CSS2.1 CSS3.0这几个版本&#xff0c;CSS3.0是CSS最新版本 1.2 CSS引入方式 ① 在一个页面引入CSS&#xff0c;共有三种方式 外部…...

自动执行探索性数据分析 (EDA),更快、更轻松地理解数据

一、说明 EDA是 exploratory data analysis (探索性数据分析 )的缩写。所谓EDA就是在数据分析之前需要对数据进行以此系统性研判&#xff0c;在这个研判后&#xff0c;得到基本的数据先验知识&#xff0c;在这个基础上进行数据分析。本文将在R语言和python语言的探索性处理。 摄…...

【自定义系统服务】【android13】添加自定义java系统服务

背景 在平时的业务开发中,我们往往需要开发自定义的系统服务来处理自己特殊的需求,这里介绍的是添加自定义的Java系统服务,可以在系统App中直接调用 定义aidl Binder默认可以传输基本类型的数据,如果要传递类对象,则这个类需要实现序列化。我们先定义一个序列化的自定义…...

【Sklearn】基于随机梯度下降算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于随机梯度下降算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 随机梯度下降(Stochastic Gradient Descent,SGD)是一种优化算法,用于训练模型的参数以最小化损失函数。在分…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…...