2017-03-09 63 views
0

我在將一些代碼從matlab移植到golang時遇到困難 我想知道如何在golang中對它們進行排序後如何獲取數組索引,然後如何使用這些索引重新設置索引,安排另一個陣列?例如下面的matlab代碼可以做到這一點,但我無法弄清楚Go在做同樣的事情。任何幫助深表謝意。如何按照golang中的索引進行排序

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 

感謝很多提前

+0

迭代過'x',並從'填充值的新的數組Y [X_I]'https://play.golang.org/p/z2j_MrEaC8 – zerkms

+0

如若陣列中的值'6' 'x'實際上是'5'? –

+0

不一定。 – user3134575

回答

2

你可以箱子一個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] 
+0

謝謝JimB!來自我曾經很容易做的Matlab背景,但現在與Go一起努力,所以你的代碼片段對我來說非常有用。再次感謝您的幫助。 – user3134575

相關問題