Skip to content

Instantly share code, notes, and snippets.

@oiuww09fn
Created January 6, 2015 14:41
Show Gist options
  • Save oiuww09fn/f0c706d430e94d6aa794 to your computer and use it in GitHub Desktop.
Save oiuww09fn/f0c706d430e94d6aa794 to your computer and use it in GitHub Desktop.
hash_set // go并发编程实战
package set
import (
"bytes"
"fmt"
)
type HashSet struct {
m map[interface{}]bool
}
func NewHashSet() *HashSet {
return &HashSet{m: make(map[interface{}]bool)}
}
func (set *HashSet) Add(v interface{}) bool {
if !set.m[v] {
set.m[v] = true
return true
}
return false
}
func (set *HashSet) Remove(v interface{}) {
delete(set.m, v)
}
func (set *HashSet) Clear() {
set.m = make(map[interface{}]bool)
}
func (set *HashSet) Contains(v interface{}) bool {
return set.m[v]
}
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 k := range set.m {
if !other.Contains(k) {
return false
}
}
return true
}
func (set *HashSet) Elements() []interface{} {
initialLen := set.Len()
snapshot := make([]interface{}, initialLen)
actualLen := 0
for k := range set.m {
if actualLen < initialLen {
snapshot[actualLen] = k
} else {
snapshot = append(snapshot, k)
}
actualLen++
}
if actualLen < initialLen {
return snapshot[:actualLen]
}
return snapshot
}
func (set *HashSet) String() string {
var buf bytes.Buffer
buf.WriteString("Set{")
first := true
for k := range set.m {
if first {
first = false
} else {
buf.WriteString(", ")
}
buf.WriteString(fmt.Sprintf("%v", k))
}
buf.WriteString("}")
return buf.String()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment