我们知道,Python的list十分强大,其自带很多有用的方法,在Go中大多需要自己实现。下面,我为切片[]int实现大多数常用的功能。
未完待续,想到实用的函数会继续添加。
type slice []int
检查切片是否包含某元素item
func (s *slice) Contain(item int) bool{
for _,v :=range *s{
if v == item{
return true
}
}
return false
}
// var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
// fmt.Println(s.Contain(3)) //true
// fmt.Println(s.Contain(8)) //false
Find
获取某元素在切片中的索引值序列和它的个数
func (s *slice) Find(item int) ([]int,int){
var indexes []int
for i,v := range *s{
if v == item{
indexes = append(indexes,i)
}
}
return indexes,len(indexes)
}
//var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
//fmt.Println(s.Find(1)) //[0 1 5] 3
Delete
删除切片中指定的元素item
func (s *slice) Delete(item int){
indexes,_ := s.Find(item)
var temp = 0
for _,index := range indexes{
index -= temp
*s = append((*s)[:index],(*s)[index+1:]...)
temp +=1
}
}
// var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
// s.Delete(5)
// fmt.Println(s) //[1 1 2 3 2 1 4 6 3 2 7 6]
Insert
切片指定位置index添加元素item
func (s *slice) Insert(item,index int) {
var temp = make(slice,index)
copy(temp,(*s)[:index])
temp = append(temp,item)
*s = append(temp,(*s)[index:]...)
}
// var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
// s.Insert(3,5)
// fmt.Println(s) //[1 1 2 3 2 3 1 4 6 3 5 2 5 7 6 5]
Replace
将切片中指定元素old用新元素new替代
func (s *slice) Replace(old, new int) {
for i,v :=range *s{
if v == old{
(*s)[i] = new
}
}
}
// var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
// s.Replace(1,9)
// fmt.Println(s) //[9 9 2 3 2 9 4 6 3 5 2 5 7 6 5]
Max
返回切片最大值
func (s *slice) Max() int{
var max=(*s)[0]
for _,v := range *s{
if v>max{
max=v
}
}
return max
}
// var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
// fmt.Println(s.Max()) //7
Min
返回切片的最小值
func (s *slice) Min() int{
var min = (*s)[0]
for _,v:=range *s{
if v
Reverse
将切片反转
func (s *slice) Reverse() {
for i,j := 0, len(*s)-1; i
Set
实现集合功能(值不重复,默认排序)
func (s *slice) Set() []int {
var res []int
var m = make(map[int]int)
for _,v := range *s{
if _, ok := m[v]; !ok{
m[v] = 0
}
}
for k:= range m{
res = append(res,k)
}
sort.Ints(res)
return res
}
// var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
// fmt.Println(s.Set()) //[1 2 3 4 5 6 7]
求两个切片的交集(先Set去重)
func (s *slice) Intersect(arr []int) []int{
s1 := s.Set()
a := slice(arr)
s2 := a.Set()
var res []int
for _,v1 := range s1{
for _, v2 :=range s2{
if v1 == v2{
res = append(res,v1)
}
}
}
return res
}
// var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
// fmt.Println(s.Intersect([]int{2,3,7,8,10})) //[2 3 7]
Union
求两个切片的并集(不包括重复值)
func (s slice) Union(arr []int) []int {
var r []int
res := slice(r)
res = append(s,arr[0:]...)
res = res.Set()
return res
}
// var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
// fmt.Println(s.Union([]int{2,3,7,8,10})) //[1 2 3 4 5 6 7 8 10]
全排列(返回无重复值的全排列结果)
func (s slice) Full() [][]int {
set := s.Set()
var m = make([][]int, len(set))
if len(set)<=1{
m[0] = set
return m
}
var res [][]int
for i := range set{
var temp []int
temp = append(temp,set[:i]...)
temp = append(temp,set[i+1:]...)
p := slice(temp).Full()
for _, r:=range p{
var t []int
t = append(t,set[i])
for _,v :=range r{
t = append(t,v)
}
res = append(res,t)
}
}
return res
}
// var s = slice{1,2,3,4}
// fmt.Println(s.Full())
//[[1 2 3 4] [1 2 4 3] [1 3 2 4] [1 3 4 2] [1 4 2 3] [1 4 3 2] [2 1 3 4] [2 1 4 3] //[2 3 1 4] [2 3 4 1] [2 4 1 3] [2 4 3 1] [3 1 2 4] [3 1 4 2] [3 2 1 4] [3 2 4 1] //[3 4 1 2] [3 4 2 1] [4 1 2 3] [4 1 3 2] [4 2 1 3] [4 2 3 1] [4 3 1 2] [4 3 2 1]]