Go 如何将[]int转换为[2]int?
我有返回[2]int的函数,还有sliceGo 如何将[]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
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]