@@ -16,49 +16,64 @@ package sets
16
16
import (
17
17
"bytes"
18
18
"fmt"
19
+ "sync"
19
20
)
20
21
21
22
type HashSet struct {
22
- m map [interface {}]bool
23
+ m map [interface {}]bool
24
+ lock * sync.Mutex
23
25
}
24
26
25
27
func NewHashSet () * HashSet {
26
28
return & HashSet {
27
- m : make (map [interface {}]bool ),
29
+ m : make (map [interface {}]bool ),
30
+ lock : & sync.Mutex {},
28
31
}
29
32
}
30
33
31
34
func (set * HashSet ) Add (elements ... interface {}) {
35
+ set .lock .Lock ()
32
36
for _ , e := range elements {
33
37
if ! set .m [e ] {
34
38
set .m [e ] = true
35
39
}
36
40
}
41
+ set .lock .Unlock ()
37
42
}
38
43
39
44
func (set * HashSet ) Remove (elements ... interface {}) {
45
+ set .lock .Lock ()
40
46
for _ , e := range elements {
41
47
delete (set .m , e )
42
48
}
49
+ set .lock .Unlock ()
43
50
}
44
51
45
52
// whether all the elements are in the set
46
53
// return true if all in, or false
47
54
func (set * HashSet ) Contains (elements ... interface {}) bool {
55
+ set .lock .Lock ()
48
56
for _ , e := range elements {
49
57
if ! set .m [e ] {
58
+ set .lock .Unlock ()
50
59
return false
51
60
}
52
61
}
62
+ set .lock .Unlock ()
53
63
return true
54
64
}
55
65
56
66
func (set * HashSet ) Clear () {
67
+ set .lock .Lock ()
57
68
set .m = make (map [interface {}]bool )
69
+ set .lock .Unlock ()
58
70
}
59
71
60
72
func (set * HashSet ) Len () int {
61
- return len (set .m )
73
+ set .lock .Lock ()
74
+ len := len (set .m )
75
+ set .lock .Unlock ()
76
+ return len
62
77
}
63
78
64
79
func (set * HashSet ) Empty () bool {
@@ -75,26 +90,28 @@ func (set *HashSet) Same(other Set) bool {
75
90
76
91
func (set * HashSet ) Elements () []interface {} {
77
92
snapshot := make ([]interface {}, 0 )
93
+ set .lock .Lock ()
78
94
for key := range set .m {
79
95
snapshot = append (snapshot , key )
80
96
}
97
+ set .lock .Unlock ()
81
98
82
99
return snapshot
83
100
}
84
101
85
102
func (set * HashSet ) String () string {
86
103
var buf bytes.Buffer
87
- buf .WriteString ("HashSet{" )
104
+ buf .WriteString ("HashSet{ " )
88
105
first := true
89
- for key := range set .m {
106
+ for _ , key := range set .Elements () {
90
107
if first {
91
108
first = false
92
109
} else {
93
110
buf .WriteString (" " )
94
111
}
95
112
buf .WriteString (fmt .Sprintf ("%v" , key ))
96
113
}
97
- buf .WriteString ("}" )
114
+ buf .WriteString (" }" )
98
115
99
116
return buf .String ()
100
117
}
0 commit comments