我的编程空间,编程开发者的网络收藏夹
学习永远不晚

`sort.Slice` 顺序是不确定的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

`sort.Slice` 顺序是不确定的

php小编草莓将为您介绍关于`sort.Slice`函数的一些重要信息。在Go语言中,`sort.Slice`函数用于对切片进行排序,但其排序结果的顺序是不确定的。也就是说,对于相同的输入切片,每次排序的结果可能会有所不同。这是因为`sort.Slice`函数使用了一种快速且高效的排序算法,但排序的具体顺序是基于输入数据的特定条件而定的。因此,在使用`sort.Slice`函数时,我们应该注意到排序结果的不确定性,以避免在依赖特定排序顺序的场景中出现问题。

问题内容

我正在尝试使用 go 标准库中的 sort.slice 对字符串切片进行排序。我希望它们按字母顺序排序,除了我希望空字符串出现在所有其他字符串之后(因此我不能只使用 sort.strings)。

对于 less 函数,我认为这会起作用:

func(i, j int) bool {
    return s[j] == "" || s[i] < s[j]
}

但是,根据输入顺序,我似乎得到了随机答案。这是 mwe:

package main

import (
    "fmt"
    "math/rand"
    "sort"
    "time"
)

func main() {
    s := []string{"", "foo", "bar", "baz"}

    rand.seed(time.now().unix())
    rand.shuffle(len(s), func(i, j int) {
        s[i], s[j] = s[j], s[i]
    })
    fmt.printf("%q\n", s)

    sort.slice(s, func(i, j int) bool {
        return s[j] == "" || s[i] < s[j]
    })
    fmt.printf("%q\n", s)
}

这是运行几次的输出:

$ go run ./z
["" "foo" "baz" "bar"]
["bar" "baz" "foo" ""]
$ go run ./z
["baz" "" "foo" "bar"]
["bar" "" "baz" "foo"]
$ go run ./z
["bar" "foo" "" "baz"]
["" "bar" "baz" "foo"]
$ go run ./z
["bar" "foo" "baz" ""]
["" "bar" "baz" "foo"]

解决方法

这是因为您的 less() 函数没有说出您想要的内容。

您说您希望将空字符串排序在所有非空字符串之后。你的逻辑:

return s[j] == "" || s[i] < s[j]

这确实告诉我们第二个是否是 "",那么第一个就更少。这或多或少是正确的(除非两者都是空的,“is-less”并不是真的:它们是相等的)。但是,如果第一个是 "" 而第二个不是怎么办?那么你的函数应该返回 false 但它返回 s[i] < s[j]。如果第二个不为空,则为 true,告诉 "" 小于另一个,与你想要的正好相反。

正确的“is-less”关系是这样的:

sort.slice(s, func(i, j int) bool {
    if s[j] == "" && s[i] != "" {
        return true
    }
    if s[i] == "" && s[j] != "" {
        return false
    }
    return s[i] < s[j]
})

如果只有第二个是 "",则您希望第一个更少。如果只有第一个是空的,您希望它“不少于”。否则使用正常顺序(按字节)。

在 go playground 上尝试一下。

请注意,如果第一个和第二个值都为空,则此函数将返回 false,因为 "" 不小于 "" (它们相等)。这是要返回的正确值,尽管在此处返回 true 仍会导致正确的顺序(交换空元素将导致相同的结果),但这可能会导致更少的交换。

使用 xor 转换逻辑

请注意,在自定义逻辑中,如果只有一个字符串为空,则会偏离正常顺序。这是逻辑异或(异或)关系: a xor btrue 如果只有 a 或只有 btrue。在 go 中,没有逻辑 xor 运算符,但 a xor b 相当于 a != b

如果“检测到”一个空字符串,如果第二个空字符串为空,则结果为 true(否则为 false)。因此我们可以将这种身份转换应用到我们的逻辑中:

sort.Slice(s, func(i, j int) bool {
    // Move empty elements to the end:
    if (s[i] == "") != (s[j] == "") { // If only one is empty
        return s[j] == ""
    }
    return s[i] < s[j]
})

这更短并且可能更高效,但正如您所看到的,它更难理解。仅当性能很重要时才使用此选项。在 go playground 上尝试一下这个。

以上就是`sort.Slice` 顺序是不确定的的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

`sort.Slice` 顺序是不确定的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

`sort.Slice` 顺序是不确定的

php小编草莓将为您介绍关于`sort.Slice`函数的一些重要信息。在Go语言中,`sort.Slice`函数用于对切片进行排序,但其排序结果的顺序是不确定的。也就是说,对于相同的输入切片,每次排序的结果可能会有所不同。这是因为`sor
`sort.Slice` 顺序是不确定的
2024-02-10

PHP 函数执行顺序是如何确定的?

函数执行顺序由定义顺序、调用顺序、嵌套和返回决定。先定义的函数先执行,调用顺序决定执行先后,内部函数先执行,函数调用会阻塞当前执行直到函数返回。PHP 函数执行顺序是如何确定的?在 PHP 中,函数执行顺序由以下因素决定:定义顺序: 先定
PHP 函数执行顺序是如何确定的?
2024-04-17

Maven插件执行顺序是怎么确定的

Maven插件的执行顺序是由插件在POM文件中声明的顺序决定的。当Maven构建项目时,它会按照POM文件中插件声明的顺序依次执行插件。如果有多个插件在同一个生命周期阶段中执行,Maven会按照它们在POM文件中的顺序依次执行。可以通过在
Maven插件执行顺序是怎么确定的
2024-04-09

电脑正确的开关机顺序是什么

正确的电脑开关机顺序是:1. 关闭电脑系统:首先,关闭所有正在运行的程序和文件,并保存所有未保存的工作。2. 关闭应用程序:逐个关闭所有打开的应用程序。3. 关闭电脑:点击“开始菜单”或桌面左下角的Windows图标,选择“关机”选项。4.
2023-09-07

element修改MessageBox弹框中确定和取消按钮顺序

在使用MessageBox弹框函数时,确定和取消按钮的顺序是根据操作系统的语言设置决定的,并且无法直接修改。在不同的操作系统和语言环境下,确定和取消按钮的顺序可能会发生变化。如果你想要自定义弹框中确定和取消按钮的顺序,可以考虑使用其他的弹框
2023-09-12

&&、()、||是如何决定Linux命令的执行顺序

这期内容当中小编将会给大家带来有关&&、()、||是如何决定Linux命令的执行顺序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux系统中Linux命令:&&、()、||决定了决定Linux命令的
2023-06-28

定义CSS3属性的书写顺序

编程学习网:不同书写顺序示例首先是比较聪明和值得推荐的写法: not-a-square {-webkit-border-radius: 10px-moz-border-radius: 10pxborder-radius: 10px},以下就是可能会产生问题的书写顺序。
定义CSS3属性的书写顺序
2024-04-23

电脑开关机的正确的操作步骤顺序

电脑开关机的正确操作步骤顺序如下:1. 关机: a. 保存所有工作并关闭所有应用程序。 b. 点击开始菜单。 c. 选择“关机”选项。 d. 等待电脑完全关闭,屏幕变黑。2. 开机: a. 按下电脑的电源按钮。 b.
2023-09-07

PHP 事件监听器的执行顺序是如何定义的?

php 事件监听器的执行顺序由优先级和注册顺序共同决定:优先级:更高的值表示更优先的执行(范围为 -10 至 10)。注册顺序:具有相同优先级的监听器按注册顺序执行。PHP 事件监听器的执行顺序:深入浅出理解 PHP 事件系统PHP 中
PHP 事件监听器的执行顺序是如何定义的?
2024-04-17

windows找不到文件确定是否正确怎么解决

本文小编为大家详细介绍“windows找不到文件确定是否正确怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows找不到文件确定是否正确怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。win
2023-07-01

Win8程序不兼容怎么查看?兼容中心是如何确定程序的兼容性

Win8对于投入运营不长时间的系统来说,存在系统和软件的兼容性问题是很常见的。毕竟,之前的系统Win7和Xp系统,由于普及率较高,许多程序和软件都是根据他们进行开发的。所以,现在的系统存在很大的兼容性问题。对此,微软公司特别推出了Windo
2022-06-04

mysql的执行顺序是什么

mysql的执行顺序是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、执行顺序根据查询指定的表格,from计算笛卡尔积。on根据join_condition过滤数据。
2023-06-14

Android中小程序码是不是固定的

这篇文章主要介绍“Android中小程序码是不是固定的”,在日常操作中,相信很多人在Android中小程序码是不是固定的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android中小程序码是不是固定的”的疑
2023-06-22

MySQL 表中的默认排序顺序是什么?

MySQL 表中的默认排序顺序是升序。每当我们使用 ORDER BY 子句对表中的行进行排序时,MySQL 都会按升序给出输出,最小值在前。考虑以下来自名为“student”的表的示例 -mysql> Select * from stude
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录