Go言語実装set-スライスで実装

2060 ワード

ネット上の多くは持参した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())


}
        ,           ,   ....