博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言实现set
阅读量:6810 次
发布时间:2019-06-26

本文共 3459 字,大约阅读时间需要 11 分钟。

  hot3.png

set :

package settype Set interface {	Add(e interface{}) bool	Remove(e interface{})	Clear()	Contains(e interface{}) bool	Len() int	Same(other Set) bool	Elements() []interface{}	String() string}// 判断集合 one 是否是集合 other 的超集func IsSuperset(one Set, other Set) bool {	if one == nil || other == nil {		return false	}	oneLen := one.Len()	otherLen := other.Len()	if oneLen == 0 || oneLen == otherLen {		return false	}	if oneLen > 0 && otherLen == 0 {		return true	}	for _, v := range other.Elements() {		if !one.Contains(v) {			return false		}	}	return true}// 生成集合 one 和集合 other 的并集func Union(one Set, other Set) Set {	if one == nil || other == nil {		return nil	}	unionedSet := NewSimpleSet()	for _, v := range one.Elements() {		unionedSet.Add(v)	}	if other.Len() == 0 {		return unionedSet	}	for _, v := range other.Elements() {		unionedSet.Add(v)	}	return unionedSet}// 生成集合 one 和集合 other 的交集func Intersect(one Set, other Set) Set {	if one == nil || other == nil {		return nil	}	intersectedSet := NewSimpleSet()	if other.Len() == 0 {		return intersectedSet	}	if one.Len() < other.Len() {		for _, v := range one.Elements() {			if other.Contains(v) {				intersectedSet.Add(v)			}		}	} else {		for _, v := range other.Elements() {			if one.Contains(v) {				intersectedSet.Add(v)			}		}	}	return intersectedSet}// 生成集合 one 对集合 other 的差集func Difference(one Set, other Set) Set {	if one == nil || other == nil {		return nil	}	differencedSet := NewSimpleSet()	if other.Len() == 0 {		for _, v := range one.Elements() {			differencedSet.Add(v)		}		return differencedSet	}	for _, v := range one.Elements() {		if !other.Contains(v) {			differencedSet.Add(v)		}	}	return differencedSet}// 生成集合 one 和集合 other 的对称差集func SymmetricDifference(one Set, other Set) Set {	if one == nil || other == nil {		return nil	}	diffA := Difference(one, other)	if other.Len() == 0 {		return diffA	}	diffB := Difference(other, one)	return Union(diffA, diffB)}func NewSimpleSet() Set {	return NewHashSet()}func IsSet(value interface{}) bool {	if _, ok := value.(Set); ok {		return true	}	return false}

HashSet:

package setimport (	"bytes"	"fmt")type HashSet struct {	m map[interface{}]bool}func NewHashSet() *HashSet {	return &HashSet{m: make(map[interface{}]bool)}}func (set *HashSet) Add(e interface{}) bool {	if !set.m[e] {		set.m[e] = true		return true	}	return false}func (set *HashSet) Remove(e interface{}) {	delete(set.m, e)}func (set *HashSet) Clear() {	set.m = make(map[interface{}]bool)}func (set *HashSet) Contains(e interface{}) bool {	return set.m[e]}func (set *HashSet) Len() int {	return len(set.m)}func (set *HashSet) Same(other Set) bool {	if other == nil {		return false	}	if set.Len() != other.Len() {		return false	}	for key := range set.m {		if !other.Contains(key) {			return false		}	}	return true}func (set *HashSet) Elements() []interface{} {	initialLen := len(set.m)	snapshot := make([]interface{}, initialLen)	actualLen := 0	for key := range set.m {		if actualLen < initialLen {			snapshot[actualLen] = key		} else {			snapshot = append(snapshot, key)		}		actualLen++	}	if actualLen < initialLen {		snapshot = snapshot[:actualLen]	}	return snapshot}func (set *HashSet) String() string {	var buf bytes.Buffer	buf.WriteString("HashSet{")	first := true	for key := range set.m {		if first {			first = false		} else {			buf.WriteString(" ")		}		buf.WriteString(fmt.Sprintf("%v", key))	}	buf.WriteString("}")	return buf.String()}

转载于:https://my.oschina.net/itfanr/blog/371592

你可能感兴趣的文章
JSP丶新闻发布会系统
查看>>
神经网络----笔记(1)
查看>>
python对象--加减重构
查看>>
探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页...
查看>>
Linux学习——gcc编译C程序
查看>>
[Django学习] Django基础(8)_富文本编辑器
查看>>
第三方全网发布 返回Api文本消息解决失败
查看>>
ASP.NET MVC 3和Razor中的@helper
查看>>
Linux磁盘管理基本配置
查看>>
操作系统学习笔记:内存管理
查看>>
如何让jpa 持久化时不校验指定字段
查看>>
页面加载完就执行的设置?
查看>>
POJ 3070 Fibonacci 矩阵快速幂模板
查看>>
linux 文件系统的简单操作
查看>>
1、json背景
查看>>
web页面移动端键盘弹出后对页面布局的影响
查看>>
2015年7月之 装订空白
查看>>
POJ 3250:Bad Hair Day 好玩的单调栈
查看>>
python文件处理
查看>>
iOS Bug
查看>>