go 排序 接口排序

Go sort 包主要提供了三种排序能力:
(1)基本类型切片排序;
(2)任意类型切片排序 ;
(3)任意数据结构排序 (实现接口方法排序)

一、基本类型切片排序

为了便于对常用数据类型的操作,sort 包提供了对 []int切片、[]float64切片 和 []string 切片的排序支持。 切片排序

sort.Ints(sli)
sort.Float64s(sli1)
sort.Strings(sli2)

实现

package mainimport ("fmt""sort"
)
func main() {sli := []int{6, 568, 566, 484, 55}sort.Ints(sli)fmt.Printf("sli: %v\n", sli)sli1 := []float64{6.62, 568.54, 25.566, 484.2, 55.2}sort.Float64s(sli1)fmt.Printf("sli1: %v\n", sli1)sli2 := []string{"aa", "bb", "AA"}sort.Strings(sli2)fmt.Printf("sli2: %v\n", sli2)
}

二、任意类型的切片排序(如,结构体)

包内代码

func Slice(x any, less func(i, j int) bool) {rv := reflectlite.ValueOf(x)swap := reflectlite.Swapper(x)length := rv.Len()limit := bits.Len(uint(length))pdqsort_func(lessSwap{less, swap}, 0, length, limit)
}

实现

package mainimport ("fmt""sort"
)type student struct {name stringage  inthav  int
}func main() {//二、任意类型切片排序(如,结构体)a := student{"aa", 32, 120}b := student{"bb", 65, 100}c := student{"cc", 54, 130}d := student{"dd", 814, 62}fmt.Println(a, b, c, d)ss := []student{a, b, c, d,}sort.Slice(ss, func(i, j int) bool { //切片比较  排序return ss[i].age < ss[j].age})for _, v := range ss { //按行打印fmt.Printf("v: %v\n", v)}}

三、任意数据结构排序 (实现接口方法排序)

包内代码

type Interface interface {Len() intLess(i, j int) boolSwap(i, j int)
}
type StringSlice []string
func (x StringSlice) Len() int           { return len(x) }
func (x StringSlice) Less(i, j int) bool { return x[i] < x[j] }
func (x StringSlice) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }func Sort(data Interface) {n := data.Len()if n <= 1 {return}limit := bits.Len(uint(n))pdqsort(data, 0, n, limit)
}
func Stable(data Interface) {stable(data, data.Len())
}

实现

package mainimport ("fmt""sort"
)type person struct {name   stringage    intheight int
}
type stringperson []person//实现sort.Interface 接口方法func (x stringperson) Len() int { return len(x) }
func (x stringperson) Less(i, j int) bool {if x[i].age > x[j].age { //先以年龄作比较return true}return x[i].height > x[j].height //年龄一样的,再比身高}
func (x stringperson) Swap(i, j int) { x[i], x[j] = x[j], x[i] }func main() {sperson := []person{ //person结构类型的切片{"aa", 3, 54},{"aa", 2, 54},{"aa", 6, 54},{"aa", 3, 52},{"aa", 12, 15},}sort.Stable(stringperson(sperson))// sort.Sort(stringperson(sperson))fmt.Printf("sperson: %v\n", sperson)
}//返回
//sperson: [{aa 12 15} {aa 6 54} {aa 3 54} {aa 3 52} {aa 2 54}]

-----------end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android OpenGL ES Camera2 实现实时抠图效果

前面文章人像抠图 + OpenGL ES 还能这样玩?没想到吧,我们介绍了利用人像抠图算法生成的 mask 图,然后结合 OpenGL 可以产生一些有趣的效果。 抠图技术应用很广泛,比如很多手机的相机自带“人像留色”滤镜:人体区域保留彩色,人体区域之外灰度化。所以人像留色的关键技术在…

java后端接口实现302跳转

正常来说&#xff0c;接口返回String是"redirect:"url或者“r:”url就能实现前端接收到返回后自动302.但是我在自己的一个项目中这么写了之后发现返回的是纯字符串&#xff0c;很奇怪。 最后发现&#xff0c;如果你的controller层有RestController注解&#xff0c;那…

【vue】Vue中解读关于this.$emit()的用法:

文章目录 一、Vue.sync修饰符与this.$emit(‘update:xxx‘, newXXX)二、this.$emit()传多个参数 一、Vue.sync修饰符与this.$emit(‘update:xxx‘, newXXX) 二、this.$emit()传多个参数

Qt Core学习日记——第八天QMetaObject(下)

QMetaObject::normalizedType 将名称规范化。 例如&#xff1a; QByteArray normType QMetaObject::normalizedType(" int const *"); // normType is now "const int*" QMetaObject::connect(const QObject *sender, int signal_index, const QObject…

Langchain 的 ConversationSummaryBufferMemory

Langchain 的 ConversationSummaryBufferMemory ConversationSummaryBufferMemory 在内存中保留最近交互的缓冲区&#xff0c;但不仅仅是完全刷新旧的交互&#xff0c;而是将它们编译成摘要并使用两者。但与之前的实现不同的是&#xff0c;它使用令牌长度而不是交互次数来确定何…

Jmeter性能测试配置

Jmeter检查点/断言 在上一章节中&#xff0c;我们通过调试脚本&#xff0c;通过人工验证脚本可以完成业务功能&#xff0c; 但在性能测试中&#xff0c;我们希望能通过自动验证脚本是否完成业务功能&#xff0c;在Jmeter 中我们可以通过检查点&#xff0c;也就是断言来实现自动…

【R3F】0.8drei使用

安装引用 npm install @react-three/drei@9.50 //这里是为了和之前版本对应控制器 通过 three/examples/jsm/controls/OrbitControls.js 引入使用 查看 通过 @react-three/drei 方式很简单直接添加上对应的节点就可以可以了 import {OrbitControls, TransformControls } from …

VR全景在酒店的发展状况如何?酒店该如何做营销?

现阶段&#xff0c;VR全景技术已经被酒店、民宿、旅游景区、房产楼盘、校园等行业所应用&#xff0c;每天都有不少人通过VR全景展示来了解酒店的设施环境&#xff0c;而酒店也可以借此机会&#xff0c;详细展示自身优势&#xff0c;更大范围吸引顾客。 VR酒店拥有真实、立体的全…

Git Gui相关术语

文章目录 Git Gui主界面相关术语- Amend Last Commit&#xff08;修正最后一次提交&#xff09;- Rescan&#xff08;重新扫描&#xff09;- Sign Off&#xff08;签名&#xff09;- Stage Changed Git Gui Commit菜单相关术语- Stage to Commit&#xff08;暂存到提交&#xf…

C++ 左键实现 加线条,右键实现指定位置的点消失,现时删除线。

左键实现 加线条&#xff0c;右键实现指定位置的点消失&#xff0c;现时删除线。 // delpoint.cpp : 定义应用程序的入口点。 //#include "stdafx.h" #include "delpoint.h"#define MAX_LOADSTRING 100typedef struct tag_POINT{long x;long y;struct tag_…

opencv hand openpose

使用opencv c 来调用caffemodel 使用opencv 得dnn 模块调用 caffemodel得程序&#xff0c;图片自己输入就行&#xff0c;不做过多得解释&#xff0c;看代码清单。 定义手指关节点 const int POSE_PAIRS[20][2] { {0,1}, {1,2}, {2,3}, {3,4}, // thumb {0,5}, {5,6}, {6,7}…

Pytest框架 之【用例执行顺序】

今天在使用pytest执行用例过程中&#xff0c;使用了debug调试代码时&#xff0c;偶然发现&#xff0c;执行用例时不是自上而下的&#xff0c;pytest 中的用例执行顺序与unittest 是不一样的&#xff0c;pytest有默认的执行顺序&#xff0c;还可以自定义执行顺序。而在unittest框…

Linux 学习记录58(ARM篇)

Linux 学习记录58(ARM篇) 本文目录 Linux 学习记录58(ARM篇)一、GIC相关寄存器1. 系统框图2. 中断号对应关系 二、GICD寄存器1. GICD_CTLR2. GICD_ISENABLERx3. GICD_IPRIORITYRx4. GICD_ITARGETSRx5. GICD_ICPENDRx 三、GICC寄存器1. GICC_PMR2. GICC_CTLR3. GICC_IAR4. GICC_…

软工导论知识框架(二)结构化的需求分析

本章节涉及很多重要图表的制作&#xff0c;如ER图、数据流图、状态转换图、数据字典的书写等&#xff0c;对初学者来说比较生僻&#xff0c;本贴只介绍基础的轮廓&#xff0c;后面会有单独的帖子详解各图表如何绘制。 一.结构化的软件开发方法&#xff1a;结构化的分析、设计、…

Node.js学习笔记-02

三、node的异步I/O 四、异步编程 1、函数式编程 高阶函数 函数可以作为参数或者返回值。 偏函数用法 偏函数用法是指创建一个调用另外一个部分——参数或变量已经预置的函数——的函数的用法。 举个例子&#xff1a;在JavaScrip中进行类型判断时&#xff0c;我们通常会进…

企业网络安全与数据保护合规建设 ——从合规运营到香港上市

序言 《企业网络安全与数据保护合规建设 ——从合规运营到香港上市&#xff08;一&#xff09;》梳理了我国网络安全与数据保护领域近期主要立法情况&#xff0c;本文将着重分析拟赴港上市企业运营阶段的数据合规要点以期为拟赴港上市的相关企业提供有益的参考。 二 企业运营…

PatchMatchNet运行eth3d数据集重建 实操教程(图文并茂、超详细)、bash eval.sh脚本文件解释说明

文章目录 1 准备工作1.1 下载源码1.2 测试集下载1.2 配置环境2 eth3d 数据集 重建演示2.1 重建效果查看3 补充 测试列表定义4 Meshlab查看三维点云时 ,使用技巧总结1 Meshlab查看三维点云时 ,换背景颜色2 Meshlab查看三维点云时,点云颜色很暗淡,怎么调亮3 Meshlab和CloudCo…

Jenkins 还可以支持钉钉消息通知?一个插件带你搞定!

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…

Log4j源码解析

Log4j源码解析 主要流程 Logger logger Logger.getLogger(Main.class); 1、通过Logger.getLogger(Class clazz) 或 Logger.getLogger(String name)进入。 2、加载LogManager进jvm, 执行静态代码块执行初始化, 创建出RepositorySelector实例及LoggerRepository实例(Hierarchy…

vue3响应式最大的特点

趋于面向对象编程&#xff0c;和Java很像&#xff0c;以前v-model可以使用&#xff0c;但是现在不是了。 let postsreactive({attrs:[],name:列表}) 任何东西&#xff0c;都先扔到一个对象里面 页面使用也不需要posts.name这样一堆点,直接{{name}}可以使用一个很方便的方法甩…