Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在go中反转任意数组?_Arrays_Sorting_Go - Fatal编程技术网

Arrays 如何在go中反转任意数组?

Arrays 如何在go中反转任意数组?,arrays,sorting,go,Arrays,Sorting,Go,当然,可以编写for循环。但是代码共享通常是好的。那么,有没有一种方法可以编写对任何数组进行排序的方法呢?还有性能,所以我猜这排除了反射 排序。反向似乎不起作用。以下内容将不会编译: package main import ( "fmt" "sort" ) type A struct { X int } func main() { x := make([]A, 0) x = append(x, A{1}) x = append(x, A{2}) sort.Rever

当然,可以编写for循环。但是代码共享通常是好的。那么,有没有一种方法可以编写对任何数组进行排序的方法呢?还有性能,所以我猜这排除了反射

排序。反向似乎不起作用。以下内容将不会编译:

package main

import (
    "fmt"
    "sort"
)

type A struct {
    X int
}

func main() {
x := make([]A, 0)
x = append(x, A{1})
x = append(x, A{2})
sort.Reverse(sort.IntSlice(x))
fmt.Println(x)
}
[]A不是int切片,它是结构的切片,您必须实现sort.Interface来描述如何对其进行排序

下面是一个工作示例:

package main

import (
    "fmt"
    "sort"
)

type A struct {
    X int
}

type ByX []A

func (a ByX) Len() int           { return len(a) }
func (a ByX) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByX) Less(i, j int) bool { return a[i].X < a[j].X }

func main() {
    x := make([]A, 0)
    x = append(x, A{1})
    x = append(x, A{2})
    sort.Sort(sort.Reverse(ByX(x)))
    fmt.Println(x)
}

您应该注意到less函数是不同的。由于我们想要反向排序,而速记sort.Slice与sort.reverse不兼容,因此我们必须修改less函数以返回相反的>,而不是在某些东西无法编译或运行时,包含问题中生成的任何错误。但是代码共享总是好的。从错误的假设中产生任意的错误。好吧@volker,也许不总是,但在这种情况下是的!我不喜欢在代码中到处复制/粘贴反向循环,事实上,这就是引发这个问题的原因。干掉任何人?你不必再使用这个界面了。您可以使用.Ah sort.Reverse命令。这与for循环相比如何?遗憾的是,内置的数组接口不存在,所以您可以编写一个通用的for循环。@UAvalos这不是唯一的选择。要对对象数组进行排序时,必须指定排序顺序,因为排序函数无法区分要按哪个字段排序。即使在python中,您也必须说:people.sortlambda person:person.name,这与Go的sort.Slice速记并不遥远。即使在python中?在Javascript中不是这样。在Java中不是这样。如果您认为必须指定排序函数,那么您误解了注释。。。Reverse字面意思是数组的反向排列,不需要排序
sort.Slice(x, func(i, j int) bool { return x[i].X > x[j].X })