forked from torbiak/gopl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmapintset.go
77 lines (64 loc) · 1.11 KB
/
mapintset.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package main
import (
"bytes"
"fmt"
"sort"
)
type MapIntSet struct {
m map[int]bool
}
func NewMapIntSet() *MapIntSet {
return &MapIntSet{map[int]bool{}}
}
func (s *MapIntSet) Has(x int) bool {
return s.m[x]
}
func (s *MapIntSet) Add(x int) {
s.m[x] = true
}
func (s *MapIntSet) AddAll(nums ...int) {
for _, x := range nums {
s.m[x] = true
}
}
func (s *MapIntSet) UnionWith(t IntSet) {
for _, x := range t.Ints() {
s.m[x] = true
}
}
func (s *MapIntSet) Len() int {
return len(s.m)
}
func (s *MapIntSet) Remove(x int) {
delete(s.m, x)
}
func (s *MapIntSet) Clear() {
s.m = make(map[int]bool)
}
func (s *MapIntSet) Copy() IntSet {
copy := make(map[int]bool)
for k, v := range s.m {
copy[k] = v
}
return &MapIntSet{copy}
}
func (s *MapIntSet) String() string {
b := &bytes.Buffer{}
b.WriteByte('{')
for i, x := range s.Ints() {
if i != 0 {
b.WriteByte(' ')
}
fmt.Fprintf(b, "%d", x)
}
b.WriteByte('}')
return b.String()
}
func (s *MapIntSet) Ints() []int {
ints := make([]int, 0, len(s.m))
for x := range s.m {
ints = append(ints, x)
}
sort.IntSlice(ints).Sort()
return ints
}