为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中反转数组?

如何在 Go 中反转数组?

Go
墨色风雨 2021-06-30 10:07:46
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 中的含义。如何反转数组?我不需要排序。
查看完整描述

3 回答

?
梦里花落0921

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,它将按降序排序。


查看完整回答
反对 回复 2021-07-05
?
蓝山帝景

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 万个时崩溃。


查看完整回答
反对 回复 2021-07-05
  • 3 回答
  • 0 关注
  • 908 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信