在 Go 语言中,你可以使用 sort.Slice 对 slice 按照复杂条件进行排序。 sort.Slice 函数接受一个 slice 和一个比较函数,该比较函数定义了两个元素之间的排序关系。
以下是实现复杂条件排序的步骤和示例:
1. 基本语法
1 2 3 4
   | sort.Slice(slice, func(i, j int) bool {          return 条件 })
  | 
2. 示例:对结构体切片进行多条件排序
假设有一个包含多个 Person 的切片,我们希望按以下规则排序:
- 年龄从小到大排序。
 - 如果年龄相同,则按名字的字母顺序排序。
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   | package main
  import ( 	"fmt" 	"sort" )
  type Person struct { 	Name string 	Age  int }
  func main() { 	people := []Person{ 		{"Alice", 30}, 		{"Bob", 25}, 		{"Charlie", 30}, 		{"Dave", 25}, 	}
  	 	sort.Slice(people, func(i, j int) bool { 		 		if people[i].Age != people[j].Age { 			return people[i].Age < people[j].Age 		} 		 		return people[i].Name < people[j].Name 	})
  	fmt.Println(people) }
   | 
3. 更复杂条件:按多个字段权重排序
如果排序条件较为复杂,可以通过一个辅助函数生成比较结果。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
   | package main
  import ( 	"fmt" 	"sort" )
  type Product struct { 	Name  string 	Price float64 	Rating int }
  func main() { 	products := []Product{ 		{"Laptop", 1000, 5}, 		{"Phone", 800, 4}, 		{"Tablet", 800, 5}, 		{"Watch", 400, 4}, 	}
  	 	sort.Slice(products, func(i, j int) bool { 		 		if products[i].Price != products[j].Price { 			return products[i].Price > products[j].Price 		} 		 		if products[i].Rating != products[j].Rating { 			return products[i].Rating > products[j].Rating 		} 		 		return products[i].Name < products[j].Name 	})
  	fmt.Println(products) }
   | 
4. 注意事项
- 如果需要对不同的维度进行排序,可以考虑在比较函数中依次判断。
 sort.Slice 是不稳定的。如果需要稳定排序,可以使用 sort.SliceStable。- 对于大数据排序,可以先构造权重或转换为单一排序值,减少比较复杂度。
 
通过 sort.Slice 的灵活性,可以轻松实现各种复杂条件的排序逻辑。