如何按多个值对切片进行排序?

时间:2017-09-13 13:50:38

标签: sorting go slice

type Item struct {
    Y    int
    X    int
    otherProp    int
}

我有一些像上面那样的结构。如何首先按X值对切片item []Item进行排序,然后按照SQL ORDER BY X,Y中的Y值对其进行排序?

我看到你可以使用sort.Slice(),因为转1.8,但是有一种简单的方法可以解决这个问题而不会多次循环切片吗?

2 个答案:

答案 0 :(得分:1)

  

[...]有没有一种简单的方法可以解决这个问题而不会多次循环切片?

没有。基于比较的排序基本上总是涉及在切片上循环至少一次加一点。但不要担心:sort.Slice不做太多工作。

你的问题是什么?

答案 1 :(得分:0)

按照这里的第一个例子:Package sort,我写了以下内容......

Less()函数中,我检查X是否相等,如果是,我会检查Y

playground demo

package main

import (
    "fmt"
    "sort"
)

type Item struct {
    X    int
    Y    int
    otherProp    int
}

func (i Item) String() string {
    return fmt.Sprintf("X: %d, Y: %d, otherProp: %d\n", i.X, i.Y, i.otherProp)
}

// ByX implements sort.Interface for []Item based on
// the X field.
type ByX []Item

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

func main() {
    items := []Item{
        {1,2,3},
        {5,2,3},
        {3,2,3},
        {9,2,3},
        {1,1,3},
        {1,0,3},
    }

    fmt.Println(items)
    sort.Sort(ByX(items))
    fmt.Println(items)

}

输出:

[X: 1, Y: 2, otherProp: 3
 X: 5, Y: 2, otherProp: 3
 X: 3, Y: 2, otherProp: 3
 X: 9, Y: 2, otherProp: 3
 X: 1, Y: 1, otherProp: 3
 X: 1, Y: 0, otherProp: 3
]
[X: 1, Y: 0, otherProp: 3
 X: 1, Y: 1, otherProp: 3
 X: 1, Y: 2, otherProp: 3
 X: 3, Y: 2, otherProp: 3
 X: 5, Y: 2, otherProp: 3
 X: 9, Y: 2, otherProp: 3
]