Go 如何将[]int转换为[2]int?

Go 如何将[]int转换为[2]int?,go,Go,我有返回[2]int的函数,还有sliceages[len(ages)-2://code>。如何将此切片转换为[2]int 主程序包 进口( “fmt” “排序” ) func TwooldEstates(ages[]int)[2]int{ sort.int(年龄) 返回年龄[len(年龄)-2:] } 我是新手,我想您可以创建一个固定的数组大小2,然后将切片的前两个值复制到数组中 s := []int{1, 2, 3} var twoElements [2]int //copy the fi

我有返回[2]int的函数,还有slice
ages[len(ages)-2://code>。如何将此切片转换为[2]int

主程序包
进口(
“fmt”
“排序”
)
func TwooldEstates(ages[]int)[2]int{
sort.int(年龄)
返回年龄[len(年龄)-2:]
}

我是新手,我想您可以创建一个固定的数组大小2,然后将切片的前两个值复制到数组中

s := []int{1, 2, 3} 
var twoElements [2]int
//copy the first two values of slice into the entirety of the array
copy(twoElements[:],s[:2]) //copy returns an int of the elements copied
发件人:

copy内置函数将元素从源片复制到源片中 目标片。(作为特例,它还将从 源和目标可能重叠。 Copy返回复制的元素数,这将是最小值 len(src)和len(dst)的组合


很好地阅读了关于go内置复制功能的解释,并提供了一些示例

我会做如下操作

func TwoOldestAges(ages []int) (oldest [2]int) {
    sort.Sort(sort.Reverse(sort.IntSlice(ages)))
    copy(oldest[:], ages)
    return
}
工作示例

我在返回参数中添加了一个名称,这样您就不必指定在函数中生成的数组大小。由于数组的最大大小为2,所以副本只会将前两个结果放入数组中。因此,我们对你的年龄进行排序(按升序排序),然后将其反转,这样最高的两个结果就是前两个关键点

现在,如果需要,可以更新要返回的数组的大小,而不必更新方法内部的任何内容

编辑: 我可能还应该提到,这可以防止您因索引越界而惊慌失措。例如,如果您仅通过长度/容量为1的切片,如果您依赖
年龄[:-2]
,您很可能会遇到越界恐慌:

紧急:运行时错误:片边界超出范围[:2],容量为1


Go旨在鼓励高效的代码。由于排序的原因,您的算法是O(n logn)。更好的算法是O(n)

例如,O(n)


“如何将此切片转换为[2]int”您不能。没有什么内置的魔法可以做到这一点。您必须创建一个数组并从切片中手动填充它。这似乎是一个问题,您应该解释您试图用它解决什么问题,因为我非常确定
[2]int
数组不是解决方案。@adrio:Top N是一个众所周知的问题。例如,在SQL:.@peterSO中,您在哪里看到了要求排名前N的OP?他要求将
[]int
(切片)转换为
[2]int
(数组)。如果他解释了这个问题(这可能是一个前N个问题,因为他正在排序并获取代码中的前两个),而不是询问将切片转换为数组的方法,那么我们可以提供一个非常合适的答案,因为最有可能的方法是数组(片在后台使用数组,但通常避免与数组直接交互,因为它们是低级原语)。请注意,如果通过
s:=[]int{1},将导致恐慌
是的,他可以用if语句来结束copy函数,根据表示数组大小的常量测试数据片的长度。
package main

import (
    "fmt"
)

func TwoOldestAges(ages []int) [2]int {
    var old [2]int
    for _, age := range ages {
        if old[0] < age {
            old[1] = old[0]
            old[0] = age
        } else if old[1] < age {
            old[1] = age
        }
    }
    return old
}

func main() {
    ages := []int{1, 99, 42, 7, 66, 77}
    fmt.Println(ages)
    oldest := TwoOldestAges(ages)
    fmt.Println(oldest)
    ages = []int{1, 77, 42, 7, 66, 99}
    fmt.Println(ages)
    oldest = TwoOldestAges(ages)
    fmt.Println(oldest)
}
[1 99 42 7 66 77]
[99 77]
[1 77 42 7 66 99]
[99 77]