3 回答
TA贡献1772条经验 获得超6个赞
通常情况下,要按整数数组你包起来的IntSlice,它定义了方法Len,Less和Swap。这些方法依次由sort.Sort. 是什么sort.Reverse做的是,它采用现有的类型定义Len,Less以及Swap,但它取代了Less用一个新的,始终是潜在的逆方法Less:
type reverse struct {
// This embedded Interface permits Reverse to use the methods of
// another Interface implementation.
Interface
}
// Less returns the opposite of the embedded implementation's Less method.
func (r reverse) Less(i, j int) bool {
return r.Interface.Less(j, i)
}
// Reverse returns the reverse order for data.
func Reverse(data Interface) Interface {
return &reverse{data}
}
所以当你写的时候sort.Reverse(sort.IntSlice(s)),发生的事情是你得到了这个新的、“修改过的” IntSlice,它的Less方法被替换了。因此,如果您调用sort.Sort它,即调用Less,它将按降序排序。
TA贡献1843条经验 获得超7个赞
我迟到了 2 年,但只是为了好玩和感兴趣,我想贡献一个“奇怪的”解决方案。
假设任务确实是反转列表,那么对于原始性能bgp的解决方案可能是无与伦比的。它通过前后交换数组项来简单有效地完成工作,这种操作在数组和切片的随机访问结构中非常有效。
在函数式编程语言中,惯用的方法通常涉及递归。这在 Go 中看起来有点奇怪,而且性能会很差。也就是说,这是一个递归数组反转函数(在一个小测试程序中):
package main
import (
"fmt"
)
func main() {
myInts := []int{ 8, 6, 7, 5, 3, 0, 9 }
fmt.Printf("Ints %v reversed: %v\n", myInts, reverseInts(myInts))
}
func reverseInts(input []int) []int {
if len(input) == 0 {
return input
}
return append(reverseInts(input[1:]), input[0])
}
输出:
Ints [8 6 7 5 3 0 9] reversed: [9 0 3 5 7 6 8]
同样,这是为了好玩而不是生产。它不仅速度慢,而且如果列表太大,它还会溢出堆栈。我刚刚测试过,它会反转 100 万个ints的列表,但在 1000 万个时崩溃。
- 3 回答
- 0 关注
- 908 浏览
添加回答
举报