0
点赞
收藏
分享

微信扫一扫

golang之sort.Slice()

问题提出:

  • golang中sort.Slice()是怎么运行的

问题解答:

  • sort.Slice() 函数是 Go 语言中一个非常有用的排序函数。该函数可以对切片进行排序,同时也可以自定义排序规则。

sort.Slice() 函数的运行原理如下:

  1. 接收一个待排序的切片和一个 less 函数作为参数。less 函数接收两个参数,用于比较两个元素的大小,并返回 bool 类型的结果。
  2. sort.Slice() 函数会使用快速排序算法对切片进行排序。
  3. 在排序的过程中,sort.Slice() 函数会调用 less 函数来比较切片中的元素大小。
  4. 排序完成后,sort.Slice() 函数返回排好序的切片。

下面是一个使用 sort.Slice() 函数的例子:


package main

import (
    "fmt"
    "sort"
)

func main() {
    nums := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}

    sort.Slice(nums, func(i, j int) bool {
        return nums[i] < nums[j]
    })

    fmt.Println(nums)
}

该程序使用 sort.Slice() 函数对 nums 切片进行排序,并打印出排好序的结果。在这里,less 函数使用 nums[i] < nums[j] 的方式进行比较,即按照升序排列。

举一个更复杂点的例子:

	newGoldList := []Gold{{22,2},{33,3},{44,4}}
	sectionIds := []int{44,33,22}
	sort.Slice(newGoldList, func(i, j int) bool {
		iIndex := 0
		jIndex := 0
		for index, sectionId := range sectionIds {
			if newGoldList[i].SectionID == sectionId {
				iIndex = index
			}
			if newGoldList[j].SectionID == sectionId {
				jIndex = index
			}
		}
		return iIndex < jIndex
	})
  • 代码详解
  1. 首先,sort.Slice() 函数接收两个参数:待排序的切片和一个 less 函数。在这段代码中,待排序的切片是 newGoldList,less 函数是一个匿名函数,用于定义排序规则。
  2. 这个匿名函数接收两个参数 i 和 j,分别表示待排序的两个元素在 newGoldList 中的索引。该匿名函数会对这两个元素进行比较,以决定它们在排序结果中的相对位置。
  3. 在比较过程中,该匿名函数遍历了 sectionIds 切片,对于每个元素,判断它是否与 newGoldList[i] 或 newGoldList[j] 中的 SectionID 相同。如果相同,说明该元素所在的位置可以用来比较 newGoldList[i] 和 newGoldList[j] 的大小。
  4. 匿名函数中使用了两个变量 iIndex 和 jIndex 来保存 newGoldList[i] 和 newGoldList[j] 所在位置的索引。如果一个元素所在的位置在 sectionIds 中出现得更早,那么它的索引值就更小,因此在匿名函数的返回值中,如果 iIndex 的值比 jIndex 小,那么 newGoldList[i] 就应该排在 newGoldList[j] 前面。
  5. 最终,sort.Slice() 函数根据这个匿名函数定义的排序规则,对 newGoldList 切片进行排序,然后返回排好序的结果。

需要注意的是,如果 sectionIds 中不存在 newGoldList[i] 或 newGoldList[j] 的 SectionID,那么 iIndex 或 jIndex 的值将为 0,这可能会导致排序结果不够准确。因此,在使用这段代码时,需要确保 sectionIds 中包含了 newGoldList 中所有元素的 SectionID。

写在最后

举报

相关推荐

0 条评论