HashSet几个简单方法的实现

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(){

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值