Go语言实现set -使用切片实现

版权声明:本文为博主原创文章,欢迎大家讨论,未经博主允许不得转载. 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())


}

其实还是很简单的,下一步就是考虑线程安全,加锁了....

猜你喜欢

转载自blog.csdn.net/u010398771/article/details/84316868