github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/goset/stringset.go (about)

     1  
     2  package goset
     3  
     4  import "sort"
     5  
     6  var none = struct{}{}
     7  type StringSet struct {
     8  	Map map[string]struct{}
     9  }
    10  
    11  
    12  func NewStringSet(values ... string) *StringSet {
    13  	a := new(StringSet)
    14  	a.Map = make(map[string]struct{}, len(values))
    15  	for _,v := range values{
    16  		a.Map[v] = none
    17  	}
    18  	return a
    19  }
    20  
    21  func (a *StringSet) Add(elements ...string) *StringSet {
    22  	for _, e := range elements {
    23  		a.Map[e] = none
    24  	}
    25  	return a
    26  }
    27  
    28  func (a *StringSet) Remove(elements ...string) *StringSet {
    29  	for _, e := range elements {
    30  		delete(a.Map, e)
    31  	}
    32  	return a
    33  }
    34  
    35  func (a *StringSet) Contains(elements ...string) bool {
    36  	for _, e := range elements {
    37  		if _, ok := a.Map[e]; !ok{
    38  			return false
    39  		}
    40  	}
    41  	return true
    42  }
    43  
    44  func (a *StringSet)ContainsSet(b *StringSet) bool{
    45  	for element, _ := range b.Map{
    46  		if _, ok := a.Map[element]; !ok {
    47  			return false
    48  		}
    49  	}
    50  	return true
    51  }
    52  
    53  
    54  func (a *StringSet) Size() int {
    55  	return len(a.Map)
    56  }
    57  
    58  func (a *StringSet) RemoveSet(b *StringSet) *StringSet {
    59  	for element, _ := range b.Map {
    60  		delete(a.Map, element)
    61  	}
    62  	return a
    63  }
    64  
    65  func (a *StringSet) AddSet(b *StringSet) *StringSet {
    66  	for element, _ := range b.Map {
    67  		a.Map[element] = none
    68  	}
    69  	return a
    70  }
    71  
    72  func (a *StringSet) InterSection(b *StringSet) *StringSet {
    73  	for element, _ := range a.Map {
    74  		if _, ok := b.Map[element]; !ok {
    75  			delete(a.Map, element)
    76  		}
    77  	}
    78  	return a
    79  }
    80  
    81  func (a *StringSet) ToSortedSlice() []string {
    82  	slice := make([]string, len(a.Map))
    83  	i := 0
    84  	for element, _ := range a.Map {
    85  		slice[i] = element
    86  		i++
    87  	}
    88  	sort.Strings(slice)
    89  	return slice
    90  }
    91