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

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