package main
import (
"bytes"
"fmt"
)
type Set interface {
Add(e interface{}) bool /*添加*/
Remove(e interface{}) /*删除*/
Clear() /*清空*/
Len() int /*求长度*/
Same(other *HashSet) bool /*是否相同*/
Elements()[]interface{} /*获取HashSet的键值*/
String() string /*重构String方法*/
}
/***
* 实现HashSet的几个基本方法
*
*/
type HashSet struct{
m map[interface{}]bool
}
func (set *HashSet) Add(e interface{}) bool{
if !set.m[e]{
set.m[e] = true
return true
}
return false
}
func (set *HashSet) Remove(e interface{}){
delete(set.m,e)
}
func (set *HashSet) Clear(){
set.m = make(map[interface{}]bool)
}
func (set *HashSet) Contains(e interface{}) bool{
return set.m[e]
}
func (set *HashSet) Len() int{
return len(set.m)
}
func (set *HashSet) Same(other *HashSet) bool{
if other == nil{
return false
}
if set.Len() != other.Len(){
return false
}
for key := range set.m{
if !other.Contains(key){
return false
}
}
return true
}
func (set *HashSet) Elements() []interface{}{
initialLen := len(set.m)
snapshot := make([]interface{},initialLen)
actualLen := 0
for key:= range set.m{
if actualLen < initialLen{
snapshot[actualLen] = key
}else{
snapshot = append(snapshot,key)
}
actualLen++
}
if actualLen<initialLen{
snapshot = snapshot[:actualLen]
}
return snapshot
}
func (set *HashSet) String() string{
var buf bytes.Buffer
buf.WriteString("Set{")
first := true
for key:= range set.m{
if first {
first = false
}else{
buf.WriteString(" ")
}
buf.WriteString(fmt.Sprintf("%v",key))
}
buf.WriteString("}")
return buf.String()
}
func (set *HashSet) IsSuperset(other *HashSet) bool{
if other == nil{
return false
}
oneLen := set.Len()
otherLen := other.Len()
if oneLen == 0 || oneLen == otherLen{
return false
}
if oneLen>0 && otherLen == 0{
return true
}
for _,v := range other.Elements(){
if !set.Contains(v){
return false
}
}
return true
}
func main(){
}
HashSet几个简单方法的实现
猜你喜欢
转载自blog.csdn.net/d_x_p_m_12/article/details/86017394
今日推荐
周排行