如何按golang

时间:2017-03-09 23:08:46

标签: go

我很难将一些代码从matlab移植到golang 我想知道如何在golang中对数组索引进行排序之后获取数组索引,然后如何使用这些索引重新排列另一个数组?例如下面的matlab代码可以做到这一点,但我无法弄清楚在Go中做同样的事情。非常感谢任何帮助。

x=[3 4 2 1 6];
y=[11 12 15 16 17];
[sorted_x_vals, sorted_x_indices]=sort(x);
c=y(sorted_x_indices);  // re-arrange y according to the sorted indices

// c= 16 15 11 12 17

提前多多感谢

1 个答案:

答案 0 :(得分:3)

您可以创建一个sort.Interface实现,根据第一个切片的值,一致地对切片进行排序:

https://play.golang.org/p/y0EFj8wUN0

type by struct {
    Indices []int
    Values  []int
}

func (b by) Len() int           { return len(b.Values) }
func (b by) Less(i, j int) bool { return b.Indices[i] < b.Indices[j] }
func (b by) Swap(i, j int) {
    b.Indices[i], b.Indices[j] = b.Indices[j], b.Indices[i]
    b.Values[i], b.Values[j] = b.Values[j], b.Values[i]
}

func main() {
    x := []int{3, 4, 2, 1, 6}
    y := []int{11, 12, 15, 16, 17}

    sort.Sort(by{Indices: x, Values: y})
    fmt.Println(x)
    fmt.Println(y)
}

// [1 2 3 4 6]
// [16 15 11 12 17]

或者如果您想对这样的任意数量的切片进行排序,您可以定义[][]int类型,如此

type matrix [][]int
func (m matrix) Len() int {return len(m[0])}
func (m matrix) Less(i, j int) bool { return m[0][i] < m[0][j] }
func (m matrix) Swap(i, j int) {
    for _, s := range m {
        s[i], s[j] = s[j], s[i]
    }
}

func main() {
    x := []int{3, 4, 2, 1, 6}
    y := []int{11, 12, 15, 16, 17}
    z := []int{22, 33, 44, 55, 66}

    sort.Sort(matrix{x, y, z})
    fmt.Println(x)
    fmt.Println(y)
    fmt.Println(z)
}
// [1 2 3 4 6]
// [16 15 11 12 17]
// [55 44 22 33 66]