如何在 Go 中反转数组?

http://play.golang.org/p/W70J4GU7nA


  s := []int{5, 2, 6, 3, 1, 4}

  sort.Reverse(sort.IntSlice(s))

  fmt.Println(s)

  // 5, 2, 6, 3, 1, 4

很难理解它在 func Reverse(data Interface) Interface 中的含义。


如何反转数组?我不需要排序。


墨色风雨
浏览 909回答 3
3回答

梦里花落0921

通常情况下,要按整数数组你包起来的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,它将按降序排序。

蓝山帝景

我迟到了 2 年,但只是为了好玩和感兴趣,我想贡献一个“奇怪的”解决方案。假设任务确实是反转列表,那么对于原始性能bgp的解决方案可能是无与伦比的。它通过前后交换数组项来简单有效地完成工作,这种操作在数组和切片的随机访问结构中非常有效。在函数式编程语言中,惯用的方法通常涉及递归。这在 Go 中看起来有点奇怪,而且性能会很差。也就是说,这是一个递归数组反转函数(在一个小测试程序中):package mainimport (    "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 万个时崩溃。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go