版权声明:本文为博主原创文章,欢迎大家讨论,未经博主允许不得转载. https://blog.csdn.net/u010398771/article/details/84316868
网上很多都是使用了自带的map来实现的一个不重复的Set,使用的是map的key不重复,value就是随便了,我觉得一点不好,就自己实现了一个实现了一个,当然; .第一个版本是不考虑线程安全等等.....就做一个简单的实现,可以用就行了,下面上代码.
package main /** title:一个切片实现的不重复的Set author:create by zk time:2018年11月21日12:24:20 */ import ( "reflect" "fmt" ) /** 定义数据结构 */ type set struct { arr []interface{} } /** 获取一个新的Set */ func NewSet() *set{ return &set{make([]interface{},0)} } /** 添加元素 */ func (s *set)Add(v interface{}){ //暂时先不考虑容量啥的问题 flag:=s.Contains(v) if(!flag){ s.arr=append(s.arr,v) } } /** 添加一组元素 */ func (s *set) AddAll (v...interface{}){ for _,value:=range v{ fmt.Println(value) s.Add(value) } } /** 是否包含 */ func (s *set) Contains (v interface{}) bool { flag:=false for _,value :=range s.arr { if(reflect.DeepEqual(value, v)){ flag=true } } return flag } /** Set的尺寸 */ func (s *set) Size() int{ return len(s.arr) } /** 是否为空 */ func (s *set) IsEmpty() bool { flag:=true if s.Size()>0{ for _,value:= range s.arr{ if(value!=nil){ flag=false } } return flag }else { return s.Size()==0 } } /** 删除,成功为true,否则为false */ func (s *set) Remove(v interface{}) bool { flag:=false for index,value :=range s.arr { if(reflect.DeepEqual(value, v)){ flag=true s.arr[index]=nil } } return flag } /** 清除所有的元素 */ func (s *set) Clear(){ copy(s.arr,make([]interface{},len(s.arr))) } /** set变成一个数组进行返回 */ func (s *set)ToArray() (*[]interface{}) { return &s.arr } func main() { s:=NewSet() fmt.Println(s.IsEmpty()) /*s.Add(1) s.Add("2") s.Add(1) fmt.Println(s) b:=s.Remove(2) fmt.Println(b) fmt.Println(s)*/ s.AddAll("a","b","c") fmt.Println(s.IsEmpty()) fmt.Println(s) arr:=s.ToArray() fmt.Println(arr) s.Clear() fmt.Println(s.IsEmpty()) } 其实还是很简单的,下一步就是考虑线程安全,加锁了....