在Go语言中,按一个切片的值对两个切片排序的惯用方法是什么?
Go语言中按一个切片排序并保持双切片配对一致性
要实现按切片a排序同时保持a和b元素配对的需求,有两种常用的实现方式:
方法一:使用配对结构体
通过定义结构体将两个切片的对应元素绑定,排序后再拆分回原切片,逻辑直观清晰:
package main import ( "fmt" "sort" ) // 定义配对结构体,关联int和string类型的元素 type Pair struct { Num int Str string } func main() { a := []int{2, 5, 3, 6, 3} b := []string{"a", "b", "c", "d", "e"} // 初始化配对切片,将a和b的元素一一绑定 pairs := make([]Pair, len(a)) for i := range a { pairs[i] = Pair{Num: a[i], Str: b[i]} } // 按结构体的Num字段升序排序 sort.Slice(pairs, func(i, j int) bool { return pairs[i].Num < pairs[j].Num }) // 将排序后的元素拆分回原切片 for i := range pairs { a[i] = pairs[i].Num b[i] = pairs[i].Str } // 输出验证结果 fmt.Println("排序后的a:", a) // 输出: [2 3 3 5 6] fmt.Println("排序后的b:", b) // 输出: ["a" "c" "e" "b" "d"] }
方法二:使用索引切片排序
不需要额外定义结构体,通过对索引切片排序,再根据排序后的索引重新构建切片:
package main import ( "fmt" "sort" ) func main() { a := []int{2, 5, 3, 6, 3} b := []string{"a", "b", "c", "d", "e"} // 创建索引切片,存储原切片的索引位置 indices := make([]int, len(a)) for i := range indices { indices[i] = i } // 根据a切片的值对索引进行排序 sort.Slice(indices, func(i, j int) bool { return a[indices[i]] < a[indices[j]] }) // 根据排序后的索引,重新生成排序后的a和b切片 sortedA := make([]int, len(a)) sortedB := make([]string, len(b)) for i, idx := range indices { sortedA[i] = a[idx] sortedB[i] = b[idx] } // 替换原切片(按需选择) a = sortedA b = sortedB // 输出验证结果 fmt.Println("排序后的a:", a) // 输出: [2 3 3 5 6] fmt.Println("排序后的b:", b) // 输出: ["a" "c" "e" "b" "d"] }
两种方法都能严格保证a[i]和b[i]的配对关系与排序前一致,你可以根据实际场景选择更适合的方式。
内容的提问来源于stack exchange,提问作者Milk
相关产品推荐
相关产品推荐

