golang爬坑筆記之自問自答系列(7)——爲切片附加實用功能

我們知道,Python的list十分強大,其自帶很多有用的方法,在Go中大多需要自己實現。下面,我爲切片[]int實現大多數常用的功能。

未完待續,想到實用的函數會繼續添加。

定義

type slice []int

功能函數

  • Contain
檢查切片是否包含某元素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<min{
			min=v
		}
	}
	return min
}
//	var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
//	fmt.Println(s.Min())     //1
  • Reverse
將切片反轉
func (s *slice) Reverse() {
	for i,j := 0, len(*s)-1; i<j; i,j = i+1,j-1{
		(*s)[i], (*s)[j] = (*s)[j], (*s)[i]
	}
}
//	var s = slice{1,1,2,3,2,1,4,6,3,5,2,5,7,6,5}
//	s.Reverse()
//	fmt.Println(s)  //[5 6 7 5 2 5 3 6 4 1 2 3 2 1 1]
  • 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]
  •  Intersect
求兩個切片的交集(先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]
  • Full
全排列(返回無重複值的全排列結果)
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]]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章