golang的HashSet
最新推荐文章于 2023-03-05 01:30:41 发布
七八月份的太阳 最新推荐文章于 2023-03-05 01:30:41 发布 2806 收藏
分类专栏: golang Golang 文章标签: HashSet golang
57 篇文章 4 订阅
58 篇文章 7 订阅
import (
	"errors"
	"reflect"
)

type HashSet struct {
	//数据载体
	data map[interface{}]interface{}
	//数据类型
	dataType string
	//数据数量
	count int
}

/**
初始化并指定存储对象的类型
*/
func NewHashSet(dataType string) *HashSet {
	hashSet := new(HashSet)
	hashSet.data = make(map[interface{}]interface{})
	hashSet.dataType = dataType
	return hashSet
}

/**
返回数据数量
*/
func (hashSet *HashSet) Size() int {
	return hashSet.count
}

/**
返回数据类型
*/
func (hashSet *HashSet) GetDataType() interface{} {
	return hashSet.dataType
}

/**
添加元素
*/
func (hashSet *HashSet) Add(key interface{}) error {
	err := hashSet.checkData(key)
	if err != nil {
		return err
	}

	_, ok := hashSet.data[key]
	if ok {
		return errors.New("DataIsExist")
	}
	hashSet.count += 1
	hashSet.data[key] = key
	return nil
}

/**
删除指定Key元素
*/
func (hashSet *HashSet) Remove(key interface{}) error {
	err := hashSet.checkData(key)
	if err != nil {
		return err
	}

	value, ok := hashSet.data[key]
	if ok {
		delete(hashSet.data, value)
		hashSet.count -= 1
		return nil
	}
	return errors.New("NotFoundKey")
}

/**
判断key是否存在
*/
func (hashSet *HashSet) Contains(key interface{}) (bool, error) {
	err := hashSet.checkData(key)
	if err != nil {
		return false, err
	}
	_, ok := hashSet.data[key]
	if ok {
		return true, nil
	} else {
		return false, nil
	}
}

/**
重置
*/
func (hashSet *HashSet) Clear() {
	hashSet.count = 0
	hashSet.data = make(map[interface{}]interface{})
}

/**
判断添加元素是否为指定类型
*/
func (hashSet *HashSet) checkData(data interface{}) error {
	if data == nil {
		return errors.New("dataIsNil")
	}

	dataTypeof := reflect.TypeOf(data).String()
	if hashSet.dataType != dataTypeof {
		return errors.New("UnsupportedTypes")
	}
	return nil
}
import "fmt"

func main() {
	hashSet := NewHashSet("string")
	err := hashSet.Add("1")
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(hashSet.Size())
	err = hashSet.Add(1)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(hashSet.Size())

	err = hashSet.Remove("1")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(hashSet.Size())

	err = hashSet.Add("1")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(hashSet.Size())

	hashSet.Clear()
	fmt.Println(hashSet.Size())

	err = hashSet.Add("1")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(hashSet.Size())
	value, err := hashSet.Contains("1")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(value)
	}
}
1
UnsupportedTypes
1
0
1
0
1
true