From bfb81139b65cd99b4a231e42a810214388194ec7 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 30 Aug 2016 01:33:25 +0200 Subject: Solve set --- go/custom-set/custom_set.go | 132 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 go/custom-set/custom_set.go (limited to 'go/custom-set/custom_set.go') diff --git a/go/custom-set/custom_set.go b/go/custom-set/custom_set.go new file mode 100644 index 0000000..1994dc5 --- /dev/null +++ b/go/custom-set/custom_set.go @@ -0,0 +1,132 @@ +package stringset + +import "strings" + +const testVersion = 3 + +type Set map[string]struct{} + +func New() Set { + return make(Set) +} + +func NewFromSlice(s []string) Set { + set := make(Set) + for _, v := range s { + set[v] = struct{}{} + } + return set +} + +func (set Set) Add(s string) { + set[s] = struct{}{} +} + +func (set Set) Delete(s string) { + delete(set, s) +} + +func (set Set) Has(s string) bool { + _, ok := set[s] + return ok +} + +func (set Set) IsEmpty() bool { + return len(set) == 0 +} + +func (set Set) Len() int { + return len(set) +} + +func (set Set) Slice() []string { + tmp := make([]string, 0, len(set)) + for v := range set { + tmp = append(tmp, v) + } + return tmp +} + +func (set Set) String() string { + tmp := make([]string, 0, len(set)) + for v := range set { + tmp = append(tmp, `"`+v+`"`) + } + return `{` + strings.Join(tmp, `, `) + `}` +} + +func Equal(s1, s2 Set) bool { + if len(s1) != len(s2) { + return false + } + for v := range s1 { + if _, ok := s2[v]; !ok { + return false + } + } + return true +} + +func Subset(s1, s2 Set) bool { + for v := range s1 { + if _, ok := s2[v]; !ok { + return false + } + } + return true +} + +func Disjoint(s1, s2 Set) bool { + for v := range s1 { + if _, ok := s2[v]; ok { + return false + } + } + return true +} + +func Intersection(s1, s2 Set) Set { + set := make(Set) + for v := range s1 { + if _, ok := s2[v]; ok { + set[v] = struct{}{} + } + } + return set +} + +func Union(s1, s2 Set) Set { + set := make(Set) + for v := range s1 { + set[v] = struct{}{} + } + for v := range s2 { + set[v] = struct{}{} + } + return set +} + +func Difference(s1, s2 Set) Set { + set := make(Set) + for v := range s1 { + if _, ok := s2[v]; !ok { + set[v] = struct{}{} + } + } + return set +} + +func SymmetricDifference(s1, s2 Set) Set { + set := make(Set) + for v := range s1 { + if _, ok := s2[v]; !ok { + set[v] = struct{}{} + } + } + for v := range s2 { + if _, ok := s1[v]; !ok { + set[v] = struct{}{} + } + } + return set +} -- cgit v1.2.3