反转切片

时间:2016-01-15 17:21:47

标签: go

我不明白下面的实现有什么问题,我看一下sort.StringSlice看起来一样。

type RevStr []string

func(s RevStr) Len() int { return len(s) }
func(s RevStr) Less(i, j int) bool { return s[i] < s[j] }
func(s RevStr) Swap(i, j int) { s[i], s[j] = s[j], s[i] }

func Reverse(input string) string {
  rs := RevStr(strings.Split(input, " "))
  sort.Reverse(rs)
  return strings.Join(rs, " ")
}

4 个答案:

答案 0 :(得分:6)

sort.Reverse不对数据进行排序,而是返回一个新的sort.Interface,它将按相反的顺序对数据进行排序。所以你真的不需要你自己的类型:

func Reverse(input string) string {
    s := strings.Split(input, " ")
    sort.Sort(sort.Reverse(sort.StringSlice(s)))
    return strings.Join(s, " ")
}

游乐场:http://play.golang.org/p/w49FDCEHo3

编辑:如果您只需要反转一段字符串,只需执行以下操作:

func reverse(ss []string) {
    last := len(ss) - 1
    for i := 0; i < len(ss)/2; i++ {
        ss[i], ss[last-i] = ss[last-i], ss[i]
    }
}

游乐场:http://play.golang.org/p/UptIRFV_SI

答案 1 :(得分:2)

您的RevStr类型没有任何问题(尽管您可以使用sort.StringSlice)。您没有在相反的实施方式上调用sort.Sort

https://golang.org/pkg/sort/#example_Reverse

package main

import (
    "fmt"
    "sort"
)

func main() {
    s := []int{5, 2, 6, 3, 1, 4} // unsorted
    sort.Sort(sort.Reverse(sort.IntSlice(s)))
    fmt.Println(s)
}

答案 2 :(得分:1)

尽管@ Ainar-G提供了一种方法来反转一段字符串,但我认为在for循环中使用两个变量来反转是更好的。但这只是我个人的观点,一个风格问题:)

func reverse(s []string) []string {
    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
        s[i], s[j] = s[j], s[i]
    }
    return s
}

Playground链接以及使用示例:http://play.golang.org/p/v1Cy61NFv1

答案 3 :(得分:0)

更简单的方法,无需使用内置排序功能:

   func reverse(s []string) []string {
       for i := len(s) - 1; i >= 0; i-- {
         result = append(result, s[i])
       }
    return s
   }