Go语言中数组高级技巧

331 阅读3分钟

常用数组函数

Go语言中有一些常用的数组函数可以方便地操作数组。

例如:

len():用于获取数组的长度。

arr := [5]int{1, 2, 3, 4, 5}
length := len(arr) // length = 5

cap():用于获取数组的容量,只有在数组的底层数组是可寻址的情况下才能使用。

arr := [5]int{1, 2, 3, 4, 5}
capacity := cap(arr) // capacity = 5

copy():用于将一个数组的元素复制到另一个数组中。

arr1 := [3]int{1, 2, 3}
arr2 := [3]int{4, 5, 6}
copy(arr1, arr2) // arr1 = [4 5 6]

append():用于向数组中添加元素,如果底层数组容量不够,会自动进行扩容。

arr := []int{1, 2, 3}
arr = append(arr, 4) // arr = [1 2 3 4]

sort包:Go语言中提供了sort包来对数组进行排序,可以使用sort.Ints()函数对整型数组进行排序。

arr := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}
sort.Ints(arr) // arr = [1 1 2 3 3 4 5 5 5 6 9]

一维数组的排序

在 Go 语言中,对一维数组进行排序可以使用标准库中的 sort 包,该包提供了多种排序算法,包括快速排序、归并排序等。

相关知识点:

  1. sort.Ints 函数可以用于对整数类型的一维数组进行排序。

  2. sort.Strings 函数可以用于对字符串类型的一维数组进行排序。

  3. sort.Float64s 函数可以用于对浮点数类型的一维数组进行排序。

  4. 以上三个函数都会修改原始数组,排序后的结果会直接反映在原始数组中。

  5. sort.Search 函数可以用于在已排序的一维数组中查找指定的元素,返回元素在数组中的索引。

  6. sort.Reverse 函数可以用于将已排序的一维数组进行逆序排序。

示例代码

package main

import (
	"fmt"
	"sort"
)

func main() {
	// 对整数类型的一维数组进行排序
	numbers := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3}
	sort.Ints(numbers)
	fmt.Println("Sorted numbers:", numbers)

	// 对字符串类型的一维数组进行排序
	words := []string{"apple", "banana", "cherry", "date", "elderberry"}
	sort.Strings(words)
	fmt.Println("Sorted words:", words)

	// 对浮点数类型的一维数组进行排序
	floats := []float64{3.14, 1.41, 2.71, 4.13, 1.62}
	sort.Float64s(floats)
	fmt.Println("Sorted floats:", floats)

	// 在已排序的一维数组中查找指定的元素
	index := sort.SearchInts(numbers, 5)
	fmt.Println("Index of 5 in sorted numbers:", index)

	// 将已排序的一维数组进行逆序排序
	sort.Sort(sort.Reverse(sort.IntSlice(numbers)))
	fmt.Println("Reverse sorted numbers:", numbers)
}

二维数组的排序

Go语言中对二维数组进行排序,可以使用标准库中的sort包,其实现了多种排序算法。其中,对于二维数组,可以使用自定义排序函数进行排序。

一般情况下,排序函数需要满足以下两个条件:

  1. 接收两个参数,返回一个bool值,表示第一个参数是否应该排在第二个参数的前面;
  2. 该函数需要满足可传递性,即若 a 小于 b,b 小于 c,则 a 必须小于 c。

示例代码

package main

import (
	"fmt"
	"sort"
)

func main() {
	// 定义一个二维数组
	arr := [][]int{
		{3, 2, 1},
		{6, 5, 4},
		{9, 8, 7},
	}

	// 定义一个排序函数
	sortFunc := func(i, j int) bool {
		return arr[i][0] < arr[j][0] // 按第一列升序排序
	}

	// 对二维数组进行排序
	sort.SliceStable(arr, sortFunc)

	// 输出排序结果
	for _, row := range arr {
		fmt.Println(row)
	}
}

在上面的示例代码中,首先定义了一个二维数组arr,然后定义了一个排序函数sortFunc。该函数接收两个参数 i 和 j,返回一个 bool 值,表示 arr[i] 是否应该排在 arr[j] 的前面。这里的排序规则是按照二维数组的第一列进行升序排序。

最后使用sort.SliceStable函数对二维数组进行排序,该函数使用 stabler 来确保排序的稳定性,即对于相等的元素,排序后它们的相对位置不会改变。最后遍历排序后的二维数组并输出结果。