草庐IT

go - 如何在golang中对定长数组进行排序?

coder 2023-07-02 原文

我有以下多元数组:

x := [2][3]int{
    {3, 2, 1},
    {3, 2, 1},
}

行和列都是固定大小的。

我正在尝试检查行是否已排序,并且我理解了sort函数需要没有已知大小的数组。我如何要求去将已知大小的固定物品当作未知大小的物品对待?
var allTrue bool = true
for i := range x {
  t := sort.Ints(x[i]) == []int{1, 2, 3}
  allTrue = allTrue && t
}

我得到:
./main.go:xx:yy: sort.Ints(x[i]) used as value
./main.go:xx:yy: cannot use x[i] (type [3]int) as type []int in argument to sort.Ints

我是否正确阅读此错误消息?

最佳答案

尽管有了other answer,它提供了有关使用sort包的适当 slice 的指南,但我添加了此答案,以提供有关您发布的代码的其他更多问题的更多描述。希望这有助于您理解Go语言。

slice 简介

I undertand the sort function requires arrays without a known size [sic]



就像其他人使用said一样,这不是用Go语言描述此概念的术语。所有的Go数组的大小都是固定的,由language spec定义。如您所知,数组的类型为[N]T,其中包含一些类型为N的元素的非负数T。这在编译时是固定的,在程序运行时不会改变。

“没有已知大小的数组”最紧密地映射到 slice 。 slice 是Go中不同的类型,可用于表示特定类型的数据序列,其中长度由Go运行时动态管理。对于[]T类型的元素,它们的类型为T。特别是,它们的大小不是其类型定义的一部分,并且可以在运行时更改。对于某些 slice 变量x []T,该实现提供了:
  • 一个类似元素类型的内部支持数组,其中实现在 slice 长度增加时管理内存的分配和数组的扩展
  • 其长度len(x) –表示 slice 当前包含
  • 的元素数
  • 的容量cap(x) – slice 的总长度加上支持数组的额外范围,由于 slice 操作限制了数组上的 View 或运行时分配了更大的数组以允许附加更多内容, slice 的总长度可能会超出长度 slice 的项目。

  • 有关更多详细信息,请参见Tour of Golanguage spec on slices

    用代码解决问题

    如上所述, slice 与数组具有不同的类型,因此对于某些需要[N]T类型的NT,您不能使用[]T类型的东西。
    sort.Ints就地对整数 slice 进行排序-它具有类型签名func Ints(a []int)。您的调用sort.Ints(x[i])在索引x处索引了i数组,这将返回[3]int类型的数组。这与sort函数不兼容,并导致您观察到编译时错误。

    要从数组中获取 slice ,请使用slice expression。这样的表达式允许使用数组, slice 和其他一些类型来构造新 slice 。

    slice 表达式以a[low : high]的形式给出,其中lowhigh是可选整数,它们提供支持数组或 slice 的索引,这些索引指定了要在新 slice 中返回的范围。上面的语言规范链接提供了更多详细信息,我建议您阅读;足以说出某个数组或 slice a[:]的最简单 slice 表达式a是表示a[0:len(a)-1]的语法糖,即将数组/slice 转换为相同长度的 slice 。

    使用此技巧,通过 slice ,从多维数组中获取[]int类型的 slice :x[i][:]:
  • x[i]返回一个[3]int类型的数组,就像
  • 之前一样
  • 对返回的数组进行 slice 将返回[]int类型的 slice ,该 slice 与sort.Ints兼容。

  • sort.Ints不返回值,并且 slice 不具有可比性

    即使使用代码解决了这些问题,以下行仍然存在两个问题:
    t := sort.Ints(x[i]) == []int{1, 2, 3}
    
  • sort.Ints在原地排序;它不返回值,所以相等性测试毫无意义。
  • sort.Ints在无法比较的 slice 上运行。除非A == BA是特殊标识符B,否则无法在AB是 slice 的情况下调用nil。这是language spec涵盖的一个微妙点。 (此外:请阅读该页面,因为您会注意到数组是可比较的。)

  • 由于您无法使用==相等运算符直接比较 slice ,因此验证 slice 的逐元素相等性要求:
  • slice 具有相同的长度(不同的长度意味着一个 slice 比另一个 slice 具有更多的元素)
  • 一个 slice 的每个索引处的元素与其他 slice 相同。

  • (我忽略了一个事实,即一个 slice 可能与另一个 slice 具有不同的容量,因为我们只关心元素方式的相等性。)

    可以通过循环 slice 中的一个来验证,并验证每个索引处的元素是否与另一个 slice 中的相同索引相对应。此示例代码提供了一个示例(playground link):
    package main
    
    import (
        "fmt"
    )
    
    func CheckEquality(a, b []int) bool {
        // Slices of dissimilar length are not equal
        if len(a) != len(b) {
            return false
        }
    
        for i, el := range a {
            if b[i] != el {
                return false
            }
        }
    
        return true
    }
    
    func main() {
        var mySlice = []int{1, 2, 3, 4, 5}
        var mySlice2 = []int{1, 2, 3, 4, 5}   // same as mySlice
        var otherSlice = []int{5, 6, 7, 8, 9} // dissimilar slice
        var longSlice = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    
        fmt.Println(CheckEquality(mySlice, mySlice2))   // Expect true
        fmt.Println(CheckEquality(mySlice, otherSlice)) // Expect false
        fmt.Println(CheckEquality(mySlice, longSlice))  // Expect false
    }
    

    关于go - 如何在golang中对定长数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52451377/

    有关go - 如何在golang中对定长数组进行排序?的更多相关文章

    1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    2. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

      在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

    4. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

      我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

    5. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    6. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    7. ruby - 多次弹出/移动 ruby​​ 数组 - 2

      我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

    8. ruby - 将数组的内容转换为 int - 2

      我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

    9. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    10. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    随机推荐