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())
}
, , ....