作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我很难将一些代码从 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
提前致谢
最佳答案
你可以创建一个 sort.Interface
根据第一个 slice 的值对 slice 进行统一排序的实现:
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]
或者如果你想像这样对任意数量的 slice 进行排序,你可以像这样定义一个 [][]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]
关于go - 如何在golang中按索引排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42707252/
我是一名优秀的程序员,十分优秀!