Go语言之自定义集合Set

2020-01-28 12:04:18丽君

集合的运算包括并集、交集、差集和对称差集。

并集运算是指把两个集合中的所有元素都合并起来并组合成一个集合。

交集运算是指找到两个集合中共有的元素并把它们组成一个集合。

集合 A 对集合 B 进行差集运算的含义是找到只存在于集合 A 中但不存在于集合 B 中的元素并把它们组成一个集合。

对称差集运算与差集运算类似但有所区别。对称差集运算是指找到只存在于集合 A 中但不存在于集合 B 中的元素,再找到只存在于集合 B 中但不存在于集合 A 中的元素,最后把它们合并起来并组成一个集合。

实现并集运算


// 生成集合 set 和集合 other 的并集
func (set *HashSet) Union(other *HashSet) *HashSet {
  if set == nil || other == nil {// set和other都为nil,则它们的并集为nil
    return nil
  }
  unionedSet := NewHashSet()//新创建一个HashSet类型值,它的长度为0,即元素数量为0
  for _, v := range set.Elements() {//将set中的元素添加到unionedSet中
    unionedSet.Add(v)
  }
  if other.Len() == 0 {
    return unionedSet
  }
  for _, v := range other.Elements() {//将other中的元素添加到unionedSet中,如果遇到相同,则不添加(在Add方法逻辑中体现)
    unionedSet.Add(v)
  }
  return unionedSet
}

实现交集运算


// 生成集合 set 和集合 other 的交集
func (set *HashSet) Intersect(other *HashSet) *HashSet {
  if set == nil || other == nil {// set和other都为nil,则它们的交集为nil
    return nil
  }
  intersectedSet := NewHashSet()//新创建一个HashSet类型值,它的长度为0,即元素数量为0
  if other.Len() == 0 {//other的元素数量为0,直接返回intersectedSet
    return intersectedSet
  }
  if set.Len() < other.Len() {//set的元素数量少于other的元素数量
    for _, v := range set.Elements() {//遍历set
      if other.Contains(v) {//只要将set和other共有的添加到intersectedSet
        intersectedSet.Add(v)
      }
    }
  } else {//set的元素数量多于other的元素数量
    for _, v := range other.Elements() {//遍历other
      if set.Contains(v) {//只要将set和other共有的添加到intersectedSet
        intersectedSet.Add(v)
      }
    }
  }
  return intersectedSet
}

差集


// 生成集合 set 对集合 other 的差集
func (set *HashSet) Difference(other *HashSet) *HashSet {
  if set == nil || other == nil {// set和other都为nil,则它们的差集为nil
    return nil
  }
  differencedSet := NewHashSet()//新创建一个HashSet类型值,它的长度为0,即元素数量为0
  if other.Len() == 0 { // 如果other的元素数量为0
    for _, v := range set.Elements() {//遍历set,并将set中的元素v添加到differencedSet
      differencedSet.Add(v)
    }
    return differencedSet//直接返回differencedSet
  }
  for _, v := range set.Elements() {//other的元素数量不为0,遍历set
    if !other.Contains(v) {//如果other中不包含v,就将v添加到differencedSet中
      differencedSet.Add(v)
    }
  }
  return differencedSet
}