首页 > 其他分享 >Go语言---sort 包中sort.Ints()、sort.Strings()、sort.Slice()、sort.SliceStable()、sort.Search()方法详解

Go语言---sort 包中sort.Ints()、sort.Strings()、sort.Slice()、sort.SliceStable()、sort.Search()方法详解

时间:2024-07-30 21:28:03浏览次数:9  
标签:sort 包中 Search func int fmt Student Age

在每一种编程语言中,都会涉及到排序操作。而在Go语言中,其中内置的 sort 包中提供了根据一些排序函数来对任何序列进行排序的功能。通过这个包中的一些方法,我们可以对一些基本的可以比较大小的类型的切片进行排序,也可以通过实现排序接口的几个特定方法实现自定义排序。

sort.Ints()、sort.Strings()

  • sort.Ints --针对整型
  • sort.Strings --字符串
    默认从小到大

例如

package main

import (
	"fmt"
	"sort"
)

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

	str := []string{"ddd", "bbb", "ccc"}
	sort.Strings(str)
	fmt.Println(str)
}

在这里插入图片描述

sort.Slice()

Go 1.8之后的版本,在 sort 包中提供了 sort.Slice() ,它使用一个用户提供的函数来对序列进行排序,函数类型为 func(i, j int) bool,其中参数 i, j 是序列中的索引。与C++中的自定义排序有些类似:

bool cmd(Student a, Student b) {
    if (a.age < b.age)
        return true;
    return false;
}

此排序不能保证是稳定的:相等的元素可能会从它们的原始顺序颠倒过来。

例如:

package main

import (
	"fmt"
	"sort"
)

func main() {
	Student := []struct {
		Name string
		Age  int
	}{
		{"zhangsan", 23},
		{"wangwu", 2},
		{"lili", 18},
		{"lisi", 2},
	}

	sort.Slice(Student, func(i, j int) bool {
		return Student[i].Age < Student[j].Age
	})
	fmt.Println(Student)
}

在这里插入图片描述

sort.SliceStable()

在排序切片时会保留相等元素的原始顺序。

例如:

package main

import (
	"fmt"
	"sort"
)

func main() {
	Student := []struct {
		Name string
		Age  int
	}{
		{"zhangsan", 23},
		{"wangwu", 2},
		{"lili", 18},
		{"lisi", 2},
	}

	// 用 age 排序,年龄相等的元素保持原始顺序
	sort.SliceStable(Student, func(i, j int) bool {
		return Student[i].Age < Student[j].Age
	})
	fmt.Println(Student)

	sort.SliceStable(Student, func(i, j int) bool {
		return Student[i].Age > Student[j].Age
	})
	fmt.Println(Student)

	sort.Slice(Student, func(i, j int) bool {
		return Student[i].Age < Student[j].Age
	})
	fmt.Println(Student)
}

在这里插入图片描述

sort.Search()

语法

index := sort.Search(n int,f func(i int) bool) int

该函数使用二分查找的方法,会从[0, n)中取出一个值index,index为[0, n)中最小的使函数f(index)为True的值,并且f(index+1)也为True。如果无法找到该index值,则该方法为返回n。

实例

在数组中,找到第一个大于3的下标。

package main

import (
	"fmt"
	"sort"
)

func main() {
	a := []int{1, 2, 3, 4, 5}
	d := sort.Search(len(a), func(i int) bool { return a[i] >= 3 })
	fmt.Println(d)
}

在这里插入图片描述

标签:sort,包中,Search,func,int,fmt,Student,Age
From: https://blog.csdn.net/m0_73537205/article/details/140243001

相关文章

  • ElasticSearch的优化
    1、硬件选择Elasticsearch的基础是Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体存储的路径可在ES的配置文件../config/elasticsearch.yml中配置,如下:#-----------------------------------Paths------------------------------------##Pathtodirectorywhe......
  • elasticsearch单机版—安装详细教程
    一、ES介绍 Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎ApacheLucene™基础上的搜索引擎.当然Elasticsearch并不仅仅是Lucene那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:(1).分布式实时文件存储,并将每一个字段都编入索引,使......
  • “featuretype”参数似乎在 geopy 包中不起作用。知道为什么吗?
    我有一个位置数据框,我想获取其坐标。为此,我使用geopy包和NominatimAPI。尽管我已指定featuretype参数仅返回城市、定居点和村庄,但它仍然为我提供了高速公路、建筑物和其他不相关内容的坐标。代码的其余部分工作正常,但我需要准确的坐标,因为它是整个国家的位置列表。以下是我......
  • 使用 Easysearch 打造企业内部知识问答系统
    大家可能都有这样的经历,刚入职一家企业时,同事往往会给你分享一些文档资料,有可能是产品信息、规章制度等等。这些文档有的过于冗长,很难第一时间找到想要的内容。有的已经有了新版本,但员工使用的还是老版本。基于这种背景,我们可以利用Easysearch加LLM实现一个内部知识的QA问......
  • 记一次ElasticSearch重启之后shard未分配问题的解决 allocation_status": "no_attemp
    记一次ElasticSearch重启之后shard未分配问题的解决环境ElasticSearch6.3.2,三节点集群Ubuntu16.04一个名为user的索引,索引配置为:3primaryshard,每个primaryshard2个replica正常情况下,各个分片的分布如下:可见,user索引的三个分片平均分布在各台机器上,可以完全容忍一台机......
  • Elasticsearch跨集群搜索
    Elasticsearch(简称ES)是一种基于Lucene的搜索引擎,以其高性能、可扩展性和实时搜索能力而广受欢迎。在大型分布式系统中,跨集群搜索成为了一个重要的需求,它允许用户从多个Elasticsearch集群中联合查询数据,以提高搜索效率和数据一致性。ES|QL(ElasticsearchQueryLanguage)作为一......
  • OpenAI发布AI搜索引擎SearchGPT,怎么申请?
     北京时间7月26日凌晨,OpenAI正式推出了AI驱动的搜索引擎SearchGPT。与传统搜索引擎相比,在SearchGPT输入查询后,用户将得到一个AI生成的、包含实时网络信息的会话式回答。 SearchGPT的特点直接给出答案使用SearchGPT,你可以像使用其他搜索引擎一样输入查询。但它与传统搜......
  • Elasticsearch——聚合详解
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • elasticsearch8单机/集群部署
    目录一、ES8单节点部署集群架构1.环境准备2.创建用户和目录3.下载解压安装包3.1下载es83.2解压安装3.3授权目录4.修改配置文件5.使用system启动es5.1使用oracle-jdk启动(二选一)6.查看日志7.访问验证8.重置elastic密码8.1重置随机密码8.2自定义密码9.jvm内存调整9.1重启验证......
  • Solution - Atcoder ABC280Ex Substring Sort
    对于这种子串问题,且有多个基础串,一个比较直观的想法就是先上个广义SAM。考虑SAM与字典序如何联系上。因为跳\(\operatorname{fail}\)相当于是删除子串的一个前缀,直接这样子明显是不行的,因为跳了\(\operatorname{fail}\)字典序没有一个很直观地表示。但是反过来考虑反串,......